- PR -

SQLServerの行ロックについて

1
投稿者投稿内容
higu
会議室デビュー日: 2007/08/29
投稿数: 1
投稿日時: 2007-09-01 16:53
JAVAとSQLServerの開発をしています。

行ロックしようとしているのですが、全レコードに対して行ロックされてしまい、
テーブルロックのような振る舞いとなってしまい困っています。

JDBC接続でPreparedStatementを使用し、以下のSQL行ロックしようとしています。
PreparedStatement pstmt
= connection.preparedStatement(
SELECT * FROM TABLE WITH(HOLDLOCK,ROWLOCK) WHERE PKEY = ?);
pstmt.setString(1, "001");
pstmt.execute();

主キーを指定し、行ロック(ROWLOCK)を指定しているのですが、指定したレコード以外もロックされます。
SQLServerの状態は、Type=Key,Mode=RangeS-Sとなっています。
プロファイラで確認しましたが、ロックエスカレーションの発生もありません。

ご教授よろしくお願いいたします。
ハニワ祭り
大ベテラン
会議室デビュー日: 2005/11/15
投稿数: 115
投稿日時: 2007-10-17 23:15
下記の MSDNフォーラムにあるように
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=580927&SiteID=7

SQL SERVER では行ロックが別のセッションから見た場合、
関係ない行でもロック待ちが発生し、
結果的に行ロックに期待している挙動にならないケースがあります。
1行でも長時間更新ロックや排他ロックを占有する処理があると
同しテーブルを更新するあらゆる処理でタイムアウトが多発します。

SQLSERVERで大規模システムなんて絶対に作ってはいけません。
マイクロソフトの売り文句は全てウソですから


[ メッセージ編集済み 編集者: ハニワ祭り 編集日時 2007-10-17 23:33 ]
rain
ぬし
会議室デビュー日: 2006/10/19
投稿数: 549
投稿日時: 2007-10-18 12:45
higuさんがご覧になられているのかはわかりませんが、
気になったのでコメントします。

higuさんの疑問は、次のうちどちらでしょうか?
・行ロックをかけたつもりなのに、実際は範囲ロック(RangeS-S)になっている
・RangeS-Sと表示されているのに、実際はテーブルロックになっている

後者の場合はわかりませんが、前者であればそれは仕様です。ちゃんと理由もあります。
※HOLDLOCKとSERIALIZABLEは同じ意味です
http://www.atmarkit.co.jp/fdotnet/entwebapp/entwebapp09/entwebapp09_04.html

そもそもなぜ行ロックを必要としているのか、その理由を説明していただければ
方法の是非も含めて回答していただける方がきっといらっしゃると思います。
(私はそこまでのスキルはないので無理です。すみません)

少なくとも、
引用:

SQLSERVERで大規模システムなんて絶対に作ってはいけません。
マイクロソフトの売り文句は全てウソですから



こんな心ないコメントでスレッドが終わるのはとても残念ですので、
是非とも補足説明をいただければと思います。
1

スキルアップ/キャリアアップ(JOB@IT)