こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

Select文とデッドロックについて

現在のような処理をしています。
SQL Server2008 R2 Expless
プログラム1
 select count(*) from TABLE_A

プログラム2
BeginTrance SERIALIZABLE
 select count(*) from TABLE_A
Update TABLE_B set F1=123 Where P1=1
Commit

※ここで P1はTABLE_Bのプライマリキーとします。
この2つのプログラムを同時に実行している時に、プログラム1のSELECT文でデッドロックが発生した
との連絡ありました。
プログラム2でもエラーが発生しているのかもしれませんが、現状調査不可能為不明です。

いろいろデッドロック、ロックヒントなどいろいろ調べてみた結果、なんとなく発生するかも?とは思われますが、このような場合、本当にデッドロックが発生するのでしょうか?
また、発生する場合には、何と何がデッドロックになっているのでしょうか?
(発生するはずがないとなると調査する視点を変えてみます。)

よろしくお願いします。

投稿日時 - 2013-04-19 10:22:32

QNo.8049858

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

ANo.1

質問の内容だけならデッドロックは起こりえないと思いますが。

デッドロック:
http://e-words.jp/w/E38387E38383E38389E383ADE38383E382AF.html

デッドロックがおきる例
プログラム1
begintrans ・・・
update table_A set A1 = 1
update table_B set B1 = 2
commit

プログラム2
begintrans ・・・
update table_B set B2 = 5
update table_A set A2 = 3
commit

プログラム1は、プログラム2のupdate B set B2 = 5がcommitされるのを待っていて
プログラム2は、プログラム1のupdate A set A1 = 1がcommitされるのを待っていて
どちらも永久に終了できない状態。
updateがselectになったとしても、テーブルロックされてしまっていると同じ状態になります。

でも、質問文の内容なら、プログラム1で table_Bを使っていないので、
プログラム1が、プログラム2がcommitしていないためにテーブルロックされてしまったTABLE_Aを
selectするのにタイムアウトで失敗したということかと思われます。
(デッドロックではないのでプログラム2は正常終了し、
 プログラム1も再度実行するとエラーにならない)

SQL Server2008 R2 は確認していませんが、
SQL Serverはロックエスカレーションしてselectしているだけでテーブルロックになる場合が
あります。
但し、select count(*)くらいでテーブルロックにまでエスカレーションするのかは疑問ですが。
(テーブルロックだけではなく、行ロックでも同一行を参照しているなら起こりえますが。)

投稿日時 - 2013-04-20 14:20:51

あなたにオススメの質問