了解嵌套事务SQL

时间:2014-07-16 03:27:47

标签: sql sql-server tsql transactions

我有这段代码:

begin transaction outside
go

begin transaction inside
go
print 'inside done'
commit transaction inside

update Action set IdUser = 9999999999999

commit transaction outside

由于外键问题,此代码故意在“update Action set IdUser = 999 ...”处抛出异常。

我希望在发生任何错误的情况下回滚。这就是为什么我有一个外部交易。在现实世界中,我有一个包含大量脚本的SQL文件,我想确保所有脚本都在事务中维护,所以我想将它包装在一个外部事务中。

上面的代码不起作用。它打印“内部完成”,然后抛出异常。这个印刷品可能是一个很大的插入。

发生了什么事?我该如何解决?

1 个答案:

答案 0 :(得分:0)

使用以下模板尝试查询:

begin tran outside    
begin try    

begin tran inside  
print 'inside done' --Insert\Update\Delete  

Update Action set IdSuer = 999999999  
END TRY   

BEGIN catch  

rollback tran inside  
rollback tran outside  
GOTO FINISH  

END catch  
commit tran inside  
commit tran outside  

:FINISH  
print 'END'