2つのバッチプログラムがあります.1つは電子メールを送信し、もう1つはファックスを送信するプログラムです。彼らは両方ともQUEUE
という名前のテーブルにアクセスします。SQL Serverでロックする
電子メール送信プログラムでは、これはQUEUE
との関連で発生します。 QUEUE
テーブルで
- ロックレコード1:QUEUEテーブル内のレコードの削除1
- 電子メールのうち、送信
- プロセス:基準を満たす
QUEUE
の各レコードについて
delete from QUEUE where id = 1
- コミットトランザクション(トランザクションは自動コミットではありません)
select 1 from QUEUE with (UPDLOCK) where id = 1
FAX送信者プログラムでも、手順2でFAXを送信する点を除いて、同様の手順が実行されます。
QUEUE
から削除すると、ロックされているという例外がスローされることがあるという問題があります。それにより、電子メール/ファックスの再送信が行われる。私はこれらのプログラムによって処理されたレコード群が交差しないことを確信しています。
削除するレコードは1つだけですが、テーブルの他のレコードに対してUpdate(U)ロックを取得しようとしているようです。他のトランザクションが同じテーブル内の他のレコードをロックしていると、例外が発生します。
これで、「削除」操作で削除するレコード以外のレコードのロックを取得しないようにするオプションがあるかどうかを知る必要があります。なぜなら、この問題は、テーブル内の他のレコードをロックする「削除」操作が原因だと思われるからです。
がちなみに、ここでは(彼らは役立つ場合、私はよく分からない)データベースに関するいくつかの情報です: に
- リードコミッティスナップショットが
- スナップショット分離の状態になっています
私は擬似コードに更新ステートメントがありません)削除または選択ステートメントで意味ですか? – rizza
私はselectとXLOCKでXLOCKを使うと、削除のREADPASTがうまくいくかもしれないと思います(テストしました、他のテーブルのロックによってブロックされず、selectステートメントはレコードをロックしようとする他のステートメントに対してレコードをロックします。あなたの提案のためにたくさん。 – rizza