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

时间:2010-06-21 14:36:41

标签: .net sql transactions transactionscope

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

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

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

4 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:4)

如果您知道要回滚,请明确地执行此操作。您无法保证Dispose将回滚(如果已调用complete,则在调用Dispose时将提交事务)

关于使用或新建的问题/ Dispose它们不等同

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

相当于

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

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

答案 2 :(得分:2)

正如我所看到的,TransactionScope类的目的是使事务尽可能简化为应用程序开发人员,并且为此,使推荐的中止事务的方法成为最少考虑的事务。我相信(根据TransactionScope的文档),一个简单的Dispose是结束事务的推荐方法,如果它尚未提交,它将被回滚。

答案 3 :(得分:1)

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