以下代码中的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。
答案 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/