在迭代中使用交易

时间:2013-10-21 08:17:39

标签: sql-server

以下代码中的AS,我正在尝试在迭代中使用事务。

    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。

1 个答案:

答案 0 :(得分: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/