トランザクションのデッドロックについて
Aテーブル
Bテーブルの2つのテーブルがあり
AテーブルにINSTEAD OF INSERTトリガががあります。
トリガの動作としては
AテーブルにINSERTされたとき、
INSERTせずに、特定カラムのデータが同一のものがないか確認し
あったらAテーブルの該当レコード削除してからINSERTします。
なかった場合そのままINSERTします。
(トリガの動作はもっとよいやり方があるのかもしれませんが)
補足としては
・Aテーブルには一つのレコードしかINSERTされません。同時に複数レコードはないです。
・ほかにAテーブルにアクセスする動作はありません。
・Aテーブルには次々にINSERTがきます。
問題のデッドロックなのですが、AテーブルにINSERTするときに発生します。
デッドロックが発生する概念は理解したつもりですが、
今回はトリガ内の処理中にAテーブルへのINSERTが原因なのでしょうか。
トリガーの処理に入った時点でAテーブルはロックされない状態となってしまうのでしょうか。
対策等あれがご教示ください。
よろしくお願いします。
追記
トリガの内容を追記します。
それと、bテーブルについて記載がありませんでした。
Bはトリガ内で使用しています。
INSTED OF INSERT AS BEGIN TRAN SELECT *FROM Aテーブル WITH (TABLOCK) SET NOCOUNT ON; INSERT INTO Bテーブル SELECT *FROM INSERTED --AテーブルにA列が一致するレコードがあるか IF (NOT EXISTS (SELECT Aテーブル.A列 FROM Aテーブル,INSERTED WHERE Aテーブル.A列= INSERTED.A列 )) --A列が一致するレコードがない。 INSERT INTO Aテーブル SELECT *FROM INSERTED ELSE --AテーブルにA列が一致するレコードがある BIGIN DECLARE @R int SET @R = (SELECT A列 FROM INSERTED) DELETE FROM A列 WHERE A列 =@R INSERT INTO Aテーブル SELECT *FROM INSERTED END COMMIT TRAN