Sql server 在迭代中使用事务

Sql server 在迭代中使用事务,sql-server,Sql Server,在下面的代码中,我尝试在迭代中使用事务 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

在下面的代码中,我尝试在迭代中使用事务

    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,我不希望它像在代码中一样在它之前插入值和值,结果不应该有一个3,因为它将被事务回滚,但它仍然插入3。

事务不适用于内存中的表。如果您使用临时表
#tmp
,它将按预期工作

因为表变量的作用域有限,不属于 持久数据库,它们不受事务回滚的影响

另见

pk
0
1
2
3
4