top / index / prev / next / target / source
日記形式でつづる いがぴょんコラム ウェブページです。
JDBC経由で Microsoft SQL Server 2000に対して 更新ロック (FOR UPDATE相当) の操作を実現するための手順を調べました。
Microsoft SQL Server 2000 + JDBC において更新ロックを伴った検索および更新を実現するためには、下記の要領が必要です。
動作確認環境
Microsoft Windows 2000
Microsoft SQL Server 2000 SP3または それ以降
SQL Server 2000 Driver for JDBC Service Pack 3 (version 2.2.0040) または それ以降 http://www.microsoft.com/downloads/details.aspx?FamilyId=07287B11-0502-461A-B138-2AA54BFDC03A
データベース接続文字列に SelectMethod=cursor を加える ※重要: 更新ロックを行うかどうかにかかわらず、SelectMethod=cursor は重要な設定値となります。 例: jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=Northwind;SelectMethod=cursor
自動コミットを off に設定する。 例 Connection.setAutoCommit(false) 参考: setAutoCommit(false)を忘れると結果セットが不思議な動きをしてしまいます。 参考: トランザクション分離レベルについては、デフォルトの値である Connection.TRANSACTION_READ_COMMITTED を採用しました。ケースバイケースだとは思いますが、速度との兼ね合いや「安定度」などを考慮する必要があるでしょうね。
WITH (UPDLOCK) のようにテーブルに対してヒントを与える。 ※SQL Server 2000では FOR UPDATE の文法は利用しません (利用できません) ※JDBC APIの記載とは裏腹に、WITH句などを用いて更新カーソルである旨を明示する必要があります。 例: FROM Customers WITH (UPDLOCK)
参考 http://www.coredevelopers.net/library/j2ee/locking/db.jsp
prepareStatementに対して、ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE のフラグをセットして実行する。(スクロールの方向性について、ほとんどの場合はResultSet.TYPE_SCROLL_INSENSITIVE を選択することになります。なぜなら 実行中に他のトランザクションの更新結果を結果セットに反映させたいという局面は少ないだろうからです。) iterator.prepareStatement(iterator.getQuery(), ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
参考: 現バージョンのJDBCドライバは、ResultSet.TYPE_FORWARD_ONLY だと SENSITIVEと同じ挙動を行う模様です。すなわち結果セットが他のトランザクションの更新結果を反映して、処理中にどんどん変化していきます。
参考: このようなことから、更新カーソルであっても無くても ResultSet.TYPE_SCROLL_INSENSITIVE の指定をしておくのが無難と考えます。つまり ある時点でのスナップショットとしての結果セット(つまりカーソル)を維持しておくのが、プログラミングとして常識的な挙動を行うと考えるからです。(2005.05.24追記)
具体的な SQL文は 下記のようになります。
SELECT 列1, 列2, 列3 FROM Customers WITH (UPDLOCK) ORDER BY 列1
また、動作サンプルについては blancoDbチュートリアルに記載しています。当然のことながら、このサンプルは blancoDbベースとなっていますが、一般のJDBCプログラミングへの読み替えは、すぐに実施できることでしょう。
…それにしても、SQL Server 2000 における JDBCドライバ関連の情報を調べるのには、結構手間がかかりました。情報が極端に少ないです。上記のような基本形ソースコードを調べるだけの手順に 4時間もかかってしまいました。2005.04.29時点において Googleで検索しても更新ロックにまつわる情報はほとんど無かったです。( .NETベースのものはいくつかったのですが…)
関連する日記