- PR -

デッドロック

1
投稿者投稿内容
まめぞう
常連さん
会議室デビュー日: 2007/02/09
投稿数: 21
投稿日時: 2007-12-11 18:10
Visual Studio 2005 (C#)
SQL Server 2005 SP2

デッドロックの内容は理解しているつもりなのですが
以下の状況で一度、デッドロックが発生しています。
考えられる原因は何かありますか?
(現在評価中なのですが、同じ操作を何度繰り返しても再現していません)

(同時に実行)
トランザクションAが社員テーブルをSEELCT
トランザクションAが社員テーブルをDELETE
トランザクションAが社員テーブルをINSERT

トランザクションBが社員テーブルをSELECT
※トランザクションBのSELECT文では、他にいくつかのテーブルをJOINしています。

二つのトランザクション共に
トランザクションの分離レベルは、
既定のReadCommittedです。

過去に一度起きた時は
トランザクションBがデッドロックの対象となり
Exceptionが発生しました。

ちなみにトランザクションの前後では
OPEN、CLOSEはちゃんと行っています。
ほったて
ベテラン
会議室デビュー日: 2007/11/10
投稿数: 68
投稿日時: 2007-12-12 00:58
単なる SELECT のみでデッドロックするか?
(ってか B が SELECT しかしてないとして、単に待つだけじゃないかと。もちろん、仮にその SELECT でロックを獲得するとして)


MS SQL Server はあんまり触ったことないですが、SQL 単体で実行してみてその実行順で「デッドロック」を起こせるかどうか確認されてはいかがかと。
(Oracle だったらそれだけじゃ逆立ちしてもデッドロックを起こすことができない...select for update でも単に待つだけ:同じ行にアクセスするとして)


[ メッセージ編集済み 編集者: ほったて 編集日時 2007-12-12 01:00 ]
Anthyhime
ぬし
会議室デビュー日: 2002/09/10
投稿数: 437
投稿日時: 2007-12-12 07:52
ReadCommitted時その問い合わせ順序でデッドロックが発生することは考えられません。
ロックタイムアウトの間違いでは?
まめぞう
常連さん
会議室デビュー日: 2007/02/09
投稿数: 21
投稿日時: 2007-12-12 13:54
返信ありがとうございます。

SQL単体で実行してみてもデッドロックは起こりませんでした。
(これはSQL Server Management Studioで新しいクエリを2つ使用して試しました)

Exceptionの内容にはデッドロックが発生したと書かれており
ロックタイムアウトとは書かれていませんでした。
タイムアウトの設定は特に指定してないので
トランザクションBは待ち続けるはずなのですが。

うーん、困りました。

[ メッセージ編集済み 編集者: 未記入 編集日時 2007-12-12 13:55 ]
ほったて
ベテラン
会議室デビュー日: 2007/11/10
投稿数: 68
投稿日時: 2007-12-12 23:23
そのセッション B が何か他の処理(A と同じ行をロックするような DML)を投げていたに一票。
1

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