【问题标题】:Understanding nested transaction SQL理解嵌套事务 SQL
【发布时间】:2014-07-16 13:04:23
【问题描述】:

我有这个代码:

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 文件,我想确保所有脚本都在一个事务中维护,所以我想将它包装在一个外部事务中。

上面的代码不起作用。它正在打印“内部完成”,然后引发异常。这张印刷品可能是一个大插页。

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

【问题讨论】:

  • 您要展开打印吗?
  • 我以“打印”为例。它可能是一个插入。在现实世界中,它是一个 INSERT / UPDATE / DELETE。
  • 打印不是交易的一部分。插入、更新等可以是事务的一部分。
  • 在您的示例中,您认为期望的行为是什么?
  • 警告: SQL Server 具有支持嵌套事务的语法 - 但没有功能!如果您回滚内部事务,则此回滚会影响 ALL 事务,一直到层次结构的顶部。 SQL Server 确实真正支持嵌套事务!更多详情请见A SQL Server DBA myth a day: (26/30) nested transactions are real

标签: sql sql-server tsql transactions


【解决方案1】:

只需使用以下模板尝试您的查询:

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'  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-26
    • 1970-01-01
    • 1970-01-01
    • 2012-10-20
    • 2010-09-18
    • 2016-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多