回滚 .net 事务的最佳方法是什么?

Dan*_*don 5 .net sql transactions transactionscope

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

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

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

Run*_* FS 8

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

对于您关于使用或新建/处置的问题,它们并不等效

using(var ts = new TransactionScope())
{
}
Run Code Online (Sandbox Code Playgroud)

相当于

TransactionScope ts;
try
{
  ts = new TransactionScope();
}
finally
{
  ts.Dispose();
}
Run Code Online (Sandbox Code Playgroud)

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


kem*_*002 6

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

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

  • 正如我在链接到的另一个问题中提到的,我遇到了一些事务在 SQL 服务器上被“锁定”的问题,就好像事务既没有提交也没有回滚,然后其他用户无法访问数据在服务器上。将“Transaction.Rollback()”与“TransactionScope”一起使用的正确方法是什么?Rollback 是 Transaction 的成员,但 Rollback 不是 TransactionScope 的成员。 (3认同)