内部回滚事务也回滚外部

时间:2014-06-17 12:20:56

标签: sql sql-server tsql sqlcmd

我遇到了这样的问题。我有这个事务,$(FilePath)指定另一个脚本,它应该开始运行。

BEGIN TRANSACTION
:r $(FilePath)
GO
IF(@@ERROR <> 0)
    BEGIN
        ROLLBACK TRANSACTION
    END
ELSE
    BEGIN
        COMMIT TRANSACTION
    END

(请注意,sqlcmd调用的脚本大多不包含transacions) 问题是,如果被调用的脚本包含回滚事务,那么它也会回滚外部事务。内部脚本不包含命名事务,并且有太多脚本要重写每个要命名的事务。

如果相应的回滚事务运行,是否有办法使此事务仅回滚?

谢谢

1 个答案:

答案 0 :(得分:4)

尝试将savepoint_nameROLLBACK语句一起使用,如here所述: 如果没有此保存点,ROLLBACK语句将按事项将事务回滚到最外面的BEGIN TRANSACTION语句。

ROLLBACK { TRAN | TRANSACTION } 
     [ transaction_name | @tran_name_variable
     | savepoint_name | @savepoint_variable ] 
[ ; ]
  

没有savepoint_name或transaction_name的ROLLBACK TRANSACTION   回滚到交易的开头。嵌套时   在事务中,同一语句将所有内部事务回滚到   最外面的BEGIN TRANSACTION语句。在这两种情况下,ROLLBACK   TRANSACTION将@@ TRANCOUNT系统函数递减为0. ROLLBACK   TRANSACTION savepoint_name不会减少@@ TRANCOUNT。