【问题标题】:What is the best way to rollback a .net transaction?回滚 .net 事务的最佳方法是什么?
【发布时间】:2010-06-21 14:36:40
【问题描述】:

这个问题和我的问题有关:SQL Server and TransactionScope (with MSDTC): Sporadically can't get connection

我正在使用 .net TransactionScope 类进行一些事务编程。如果我理解正确的话,我可以通过将 SQL 调用包装在 using ts as new TransactionScope() 块中,或者使用 new TransactionScope() 然后在最后使用 TransactionScope.Dispose() 来在事务中执行一些 SQL 操作。

要提交事务,MSDN 说使用TransactionScope.Commit()。假设我想在某些情况下回滚事务,不先调用 Commit 方法,直接调用TransactionScope.Dispose() 是否足够?这是好的做法,还是应该以其他方式完成?

【问题讨论】:

  • 如果你“想在某些情况下回滚事务”,你当然不想“先调用 Commit 方法”。你会想调用 Rollback 方法...

标签: .net sql transactions transactionscope


【解决方案1】:

如果您知道要回滚,请明确执行此操作。不保证 Dispose 会回滚(在调用了 complete 的情况下,调用 Dispose 时会提交事务)

关于使用或新/处置它们的问题不等效

using(var ts = new TransactionScope())
{
}

等价于

TransactionScope ts;
try
{
  ts = new TransactionScope();
}
finally
{
  ts.Dispose();
}

要回答您的后续问题,否,如果您调用 Dispose,您将不会让您的事务“徘徊”,它会提交或回滚。但是,如果您在编写时使用 new/dispose(没有 finally 块),您可能会遇到一种情况,即 dispose 在您期望的情况下没有被调用(在异常的情况下)

【讨论】:

    【解决方案2】:

    如果您调用TransactionScope.Dispose()(通过using block 或您自己调用 Dispose 方法),它将回滚事务,除非您告诉它先提交。通过放入 Transaction.Rollback,您明确地告诉其他程序员您打算这样做。

    为了清楚起见,我可能会添加它,以表明此操作是在这种情况下进行的。关于不显式添加回滚命令的另一件事是您假设 Dispose 方法将始终以这种方式运行。实际上,这可能会是这样,但做出这种假设是有风险的。明确地回滚它总是更好,而不是希望它会为你完成。

    【讨论】:

    • 只是一个快速的后续问题:在错误的时间调用Dispose,是否有任何情况可以导致我的交易挂起?
    • 导致它挂起?可能发生的情况是,如果您调用 dispose 并且事务未提交,它将不得不回滚准备提交的所有内容,这在理论上可能会导致它“挂起”,同时将系统置于就绪状态状态。
    • 正如我在链接到的另一个问题中提到的,我的一些事务在 SQL 服务器上被“锁定”时遇到了麻烦,好像事务既没有提交也没有回滚,然后其他用户无法访问服务器上的数据。将Transaction.Rollback()TransactionScope 一起使用的正确方法是什么? Rollback 是 Transaction 的成员,但 Rollback 不是 TransactionScope 的成员。
    • @VivianRiver 我也有同样的问题!你最后做了什么?
    【解决方案3】:

    在我看来,TransactionScope 类的目的是使事务对应用程序开发人员来说尽可能地万无一失,为此,建议的中止事务的方法是最省心的方法。我相信(基于 TransactionScope 的文档)简单的 Dispose 是结束事务的推荐方法,如果尚未提交,它将被回滚。

    【讨论】:

      【解决方案4】:

      我总是将 TransactionScope 封装在 Using 块中,因为如果存在阻止事务成功完成的未处理异常,它会自动调用 Dispose。

      【讨论】:

      • 如果你在退出使用范围之前调用了完成,事务仍然会提交
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-15
      • 1970-01-01
      • 2010-09-17
      相关资源
      最近更新 更多