以下のコードのように、繰り返しでトランザクションを使用しようとしています。
Declare @i int, @TRAN_NAME varchar(40)
Declare @TMPTABLE TABLE(pk int unique)
Set @i = 0
While @i < 5 Begin
BEGIN TRY
Set @TRAN_NAME = CONVERT(varchar(20), @i)
BEGIN TRAN @TRAN_NAME
INSERT @TMPTABLE
VALUES(@i)
if @i = 3 Begin
INSERT @TMPTABLE
VALUES(@i)
End
COMMIT TRAN @TRAN_NAME
END TRY
BEGIN CATCH
ROLLBACK TRAN @TRAN_NAME
DECLARE @msg varchar(1000) = ERROR_MESSAGE()
RAISERROR(@msg,16,1)
END CATCH
Set @i = @i + 1
End
Select * from @TMPTABLE
問題は、以下のコードから取得したクエリが次の結果を返すことです。
pk
0
1
2
3
4
しかし、問題は、意図的に繰り返しに pk を挿入しようとしているので、コードのように値とその前に値を挿入したくないため、結果に 3 が含まれてはならないことです。トランザクションによってロールバックされますが、まだ 3 が挿入されます。