此问题与我的问题有关: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方法就足够了吗?这是好的做法,还是应该以其他方式完成?
答案 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。