この問題は、同時高速挿入に関するものです。私はそれが私の目に非常に興味深いことを認めなければなりません。
私は SQL Server 2008 R2 を使用して T-SQL 挿入を実行し、挿入トリガーを実行しています。
挿入と挿入後のトリガーの間でコマンドが実行されないようにしたいと思います。
分離レベルを使用すると、デッドロックが発生するか、問題が解決されません。
私が使用している手順は、Phil から SQL Server に依存する Identity への回答/解決策です。そのようなことはありますか?
問題は:
前の挿入とその挿入後のトリガーの間に挿入が入り、次のような結果になることがあります。
RoomID ItemID ItemDescription ID
------ ------ --------------- --
7 1 Door 1
7 2 Window (West) 2
7 3 Window (North) 3
8 1 Door 4
8 2 Table #1 5
8 3 Table #2 6
7 4 Table #1 7
8 4 Chair #1 8
7 6 Table #2 9
7 5 Table #3 10
8 5 Chair #2 11
ID #9 と #10 を参照してください。タイの ItemID が入れ替わっています。ItemID は、6 と 5 ではなく、それぞれ 5 と 6 である必要がありますが、10 番目の挿入は、#9 の after insert トリガーが実行を終了する前に発生した可能性があります。
この問題は、挿入の 0.5% 未満で発生します: 1000 以下の挿入に対して 4 つのレコードを含む 2 つの切り替え。はい、スイッチが発生しない場合もあります。
分離レベルを 1 段階上げても効果はなく、場合によってはより多くのキー/依存キーの切り替えが発生することさえあります。分離レベルを 2 つ上げると、デッドロックが発生しました。
分離レベルを下げるとスイッチは減りますが、それでも作成されます。
すべての挿入の前に高い分離レベルを開始し、トリガーの最後にデフォルトの分離レベルに戻すと、デッドロックが発生します (私の実験では、すべての挿入がコミットされませんでした!)。
誰かが抜け道を見ていますか?
挿入と挿入後のトリガーを強制的に一緒に実行し、その間に同じテーブルへの他の挿入を禁止する方法は?