0

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

    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。

4

1 回答 1

1

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

来自http://technet.microsoft.com/en-us/library/ms175010.aspx

因为表变量的范围有限并且不是持久数据库的一部分,所以它们不受事务回滚的影响。

另见http://www.sqlservercentral.com/blogs/steve_jones/2010/09/21/table-variables-and-transactions/

于 2013-10-21T08:21:19.727 回答