为什么SQL Server 2012中的变量表无法回滚?
我已经创建了一个变量表。在我的存储过程中,有很多事务 现在,每当发生错误时,我想回滚一个特定的事务,该事务包含一些语句,这些语句可以插入、更新或删除变量表中的记录 这只是我实际问题的一个例子:为什么SQL Server 2012中的变量表无法回滚?,sql,transactions,sql-server-2012,rollback,Sql,Transactions,Sql Server 2012,Rollback,我已经创建了一个变量表。在我的存储过程中,有很多事务 现在,每当发生错误时,我想回滚一个特定的事务,该事务包含一些语句,这些语句可以插入、更新或删除变量表中的记录 这只是我实际问题的一个例子: declare @tab table (val int) insert into @tab select 2 insert into @tab select 3 insert into @tab select 4 select * from @tab begin tran begin try
declare @tab table (val int)
insert into @tab select 2
insert into @tab select 3
insert into @tab select 4
select * from @tab
begin tran
begin try
update @tab set val = 1
select 1/0;
commit
end try
begin catch
rollback
end catch
select * from @tab
实际输出:-我的预期产出是:-
所以这里事务的回滚不起作用。为什么它不在这里工作?我做错什么了吗?您没有使用
temp
表,您使用的是变量
表。这是有区别的
临时表处理事务,变量表不处理事务。看
如果要将变量表@tab
更改为#tab
的临时表,您将获得所需的行为
临时表和变量表之间的差异:
我修改了我的问题。谢谢你的知识分享。但问题仍然是一样的。为什么它不适用于变量表
我在上面贴的链接比我能看到的更详细 我修改了我的问题。谢谢你的知识分享。但问题仍然是一样的。为什么它不适用于变量表?更新了我的答案。希望这会有所帮助。对表变量的修改会记录到
tempdb
事务日志中。但它们在每个语句之后提交的内部系统事务下运行,这些事务不参与周围的用户事务。另外一个事务包含更多关于其他差异的详细信息@MartinSmith-在Sql server:D中有什么您不知道的吗