【问题标题】:SQLTransaction and T-SQL transactionsSQLTransaction 和 T-SQL 事务
【发布时间】:2010-09-28 06:26:53
【问题描述】:

我使用的是 .NET 2.0 和 SQL Server 2005。由于历史原因,应用程序代码使用 SQLTransaction,但一些存储过程也使用 T-SQL begin/commit/rollback tran 语句。这个想法是 DBTransaction 可以跨越许多存储过程,每个单独的 sproc 控制在其范围内发生的事情 - 实际上这些是嵌套事务。

代码的旧行为是,如果任何存储过程失败,应用程序逻辑也会导致外部 SQLTransaction 也回滚。但是现在我们想改变逻辑,这样即使发生故障,外部事务也应该继续按顺序执行剩余的存储过程,然后在最后,由于我们知道有故障,我们回滚整个 SQLTransaction。

问题在于,至少就目前的编码而言,如果任何存储过程执行 ROLLBACK,外部 SQLTransaction 似乎会丢失其连接,因此任何后续重用事务的尝试都会失败。有没有办法可以在 T-SQL 中回滚但仍保持外部 SQLTransaction?我在想也许保存点在这里可能会有所帮助,但我还不太了解它们。

使这种情况复杂化的是,并不总是有外部事务,所以我不能只删除 T-SQL 回滚,即。有时,sproc 会自行执行;有时在事务的上下文中。

切换到 TransactionScope 会让事情变得更容易吗?

感谢您的任何建议...迈克

【问题讨论】:

    标签: sql-server-2005 tsql transactions rollback


    【解决方案1】:

    看看这个知识库条目:

    An unexpected exception may occur when a transaction is committed or rolled back after a data source error has occurred

    在存储过程中回滚事务将导致 ADO.NET 客户端中的任何“外部”事务消失。唯一的解决方案是将您的 Rollback() 调用包装在 try/catch 块中。如果发生这种情况,我认为不可能维持外部交易。

    【讨论】:

      【解决方案2】:

      我建议您考虑将外部事务也放在存储过程中,以便在 TSQL 中维护所有嵌套(使用 EXEC 调用其他存储过程)。 SQL Server 是一个非常丰富的开发/数据管理环境,它允许您以 ADO 笨拙地处理的方式来管理您的事务。还要记住,在存储过程中将一堆 SQL 组合在一起几乎总是比通过 ADO 连接进行多次调用更有效。

      【讨论】:

        【解决方案3】:

        您可能会对IMPLICIT_TRANSACTION 感兴趣。基本上,您可以更改存储过程的事务相关模式。在许多情况下,这是一个更简单的解决方案。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-05-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多