【问题标题】:Inner rollback transaction rolls back the outer too内部回滚事务也回滚外部
【发布时间】:2014-06-17 12:20:55
【问题描述】:

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

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

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

有没有办法让这个事务只在对应的回滚事务运行时才回滚?

谢谢

【问题讨论】:

  • 像@NickyvV 写的那样命名你的交易。
  • 听起来您无法控制正在运行的脚本的内容——如果是这种情况,您将无能为力。 SQL Server 不支持真正的嵌套事务。
  • 是的,我不允许重写脚本,但我必须在事务中运行它们。

标签: sql sql-server tsql sqlcmd


【解决方案1】:

尝试将savepoint_nameROLLBACK 语句一起使用,如here 所述:
如果没有这个保存点,ROLLBACK 语句会按照设计将事务回滚到最外层的 BEGIN TRANSACTION 语句。

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

没有保存点名称或事务名称的回滚事务 回滚到事务的开头。嵌套时 事务,同样的语句将所有内部事务回滚到 最外层的 BEGIN TRANSACTION 语句。在这两种情况下,回滚 TRANSACTION 将@@TRANCOUNT 系统函数递减为 0。 ROLLBACK TRANSACTION savepoint_name 不会减少 @@TRANCOUNT。

【讨论】:

  • 谢谢,但那行不通。问题是脚本中已经有写入的事务,这些事务具有未命名的事务,我不允许命名它们。即使我愿意,这仍然不是一个选项,因为大约有 8-900 个脚本。
猜你喜欢
  • 2014-07-17
  • 1970-01-01
  • 2021-06-19
  • 2021-10-15
  • 2017-11-21
  • 2019-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多