次のシナリオがあります。
複数のプログラムがアクセス (更新、削除、挿入、および選択) するテーブル。実際、それらは同じですが、複数のユーザーによってインスタンス化されています。プログラムは使用後にデータを削除し、新しいデータを再度挿入するため、このテーブルが 1000 行を超えることはありません。これは、サプライヤー/コレクターの状況のようなものです。
これは工業生産のシナリオであり、いくつかの操作を保証する必要があるため、ユーザーがアクションを確認すると、プログラムはシステム上の他のテーブルからのデータでそのテーブルを更新します。
そのため、多くのコマンドにトランザクションを実装しました。その結果、多くのデッドロックが発生しました。
これらのロックを回避するために何ができるかについてのヒントが欲しい. 実際、トランザクションは必要ありません。コマンドが実行されることを保証するだけでよく、何らかの理由で失敗した場合、操作全体がロールバックされます。トランザクションを使用せずにそれを行う方法があるかどうかはわかりません。
PS: SQL Server 2008 R2 を使用しています。
PS2: 更新の FROM 句で使用したいくつかのシステム テーブルが大きな問題であることがわかりました。これらのテーブルはシステム全体で使用され、大量の挿入/更新/選択を取得します。したがって、このプログラムでそのテーブルのデータを変更しなかったため、ロックしてはならないものをロックしていました。
元:
Update t1
set x= 1
from systable1 as t
inner join systable2 t2
where .....
これが大きな問題だったのでWITH (NOLOCK)
、t と t2 とWITH (ROWLOCK)
t1 にヒントを追加しました。
私が言及しなければならないもう1つのことは、これはテスト環境であり、本番環境で失敗するリスクを冒すことはできないため、データベースとプログラムに最大のストレスをかけています.
チェックポイント戦略を使用して、アクションが失敗した場合にアクションをやり直すことはできますか?
ありがとう。