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

标签 .net sql transactions transactionscope

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

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

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

最佳答案

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

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

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

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

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

关于.net - 回滚 .net 事务的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3085574/

相关文章:

c# - 强制 .NET JIT 编译器在应用程序启动期间生成最优化的代码

c# - 可以存储在列表中的元素是否有限制?

mysql - 完全匹配,然后是部分匹配

c# - HTML 敏捷包

c# - 从一个委托(delegate)转换为另一个委托(delegate)。伪 Actor

mysql - 当一个变量有一个值而另一个变量有多个值时,如何将两个变量插入表中?

sql - NHibernate 的优缺点

MySQL table locking : holder reads and writes, other session only read?

java - 如何将 @EnableTransactionManagement 与 StaticMethodMatcherPointcutAdvisor 结合使用

MySQL - 如果在事务期间插入失败,是否总是会引发异常或警告?