※ ChatGPTを利用し、要約された質問です(原文:一括テーブルロック デッドロック対策)
SQL Server2008R2でのデッドロック対策の方法とは?
このQ&Aのポイント
SQL Server2008R2でデッドロックが発生した場合、参照と更新の順番を変えずに回避する方法を知りたい。
テーブルの参照、更新の順番を変えずにデッドロックを回避する方法について、助言を求めています。
デッドロックが発生した際に、テーブルの参照、更新の順番を変えずに回避する方法を教えてください。
はじめまして。
ken7761227と申します。
SQL Server2008R2でデッドロックが発生しまして、本来であれば、テーブルの
参照、更新順を正しくする修正をすべきなのですが、今からその修正を行うのは
困難なために、更新する側が、使うテーブルをまずTABLOCKXでロックしておく
という対策をとることになりました。
ここで、A,B二つのテーブルがあったとし、
SELECT XXX FROM dbo.TableA WITH( TABLOCKX )
UNION
SELECT YYY FROM dbo.TableB WITH( TABLOCKX )
というSQLでロックしようとしています。
UNIONを用いたのは、2つのセレクトの間に違うプロセスからの割り込を
防止したかったためです。
(このSQLの実行時にトランザクションをかけて、更新後のコミットまで、
排他ロックをかけようとしています。)
TableA,TableBを更新しようとしているプロセス1が、上記SQLを実行しオーナーになります。
プロセス2がTableBをSELECTしようとすると、排他ロックで待たされるはずですよね?
実際ここは待たされていました。
また、プロセス2も更新を行おうとし、上記のSQLを実行すれば、プロセス1のコミット
までは、処理が待たされるはずだと思っていたのですが、ここでデッドロックしてしまいます。
原因が全く分からずに困っております。
最終的に、やりたいことは、テーブルの参照、更新の順番を変えずに、デッドロックを
回避することです。テーブルロックをかけかたが、間違っていますでしょうか?
また、それ以外に何か良い回避方法がありますでしょうか?
どなたか、有識者の方々のご助言頂けないでしょうか。
よろしくお願いいたします。
お礼
maiko0318さん おはようございます。 早速の解答ありがとうございます。 自分としましても、あくまで最悪タイムアウトになるだけで、デッドロックになることはない と思っていました。 プロセス1が、TableA,TableBの順で更新に行って、プロセス2がTableB,TableAの順で更新or 参照に行かない限り、デッドロックにはならないというのが、自分の理解でしたので… ですので、双方のプロセスが順番さえ守っていれば、デッドロックは回避できると 思っていました。 困りました…