【发布时间】: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