- 締切済み
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でもエラーが発生しているのかもしれませんが、現状調査不可能為不明です。 いろいろデッドロック、ロックヒントなどいろいろ調べてみた結果、なんとなく発生するかも?とは思われますが、このような場合、本当にデッドロックが発生するのでしょうか? また、発生する場合には、何と何がデッドロックになっているのでしょうか? (発生するはずがないとなると調査する視点を変えてみます。) よろしくお願いします。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- Siegrune
- ベストアンサー率35% (316/895)
質問の内容だけならデッドロックは起こりえないと思いますが。 デッドロック: 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(*)くらいでテーブルロックにまでエスカレーションするのかは疑問ですが。 (テーブルロックだけではなく、行ロックでも同一行を参照しているなら起こりえますが。)