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方法就直接调用就够了吗?这是好的做法,还是应该以其他方式完成?
如果您知道要回滚,则明确地执行此操作。不保证 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
如果您调用TransactionScope.Dispose()(通过using 块或通过自己调用 Dispose 方法),它将回滚事务,除非您告诉它先提交。通过放入 Transaction.Rollback,您明确地告诉其他程序员您打算做什么。
为了清楚起见,我可能会添加它,即此操作是在这种情况下进行的。未明确添加回滚命令的另一件事是您假设 Dispose 方法将始终以这种方式运行。实际上,情况可能是这样,但做出这种假设是有风险的。明确回滚它总是更好,而不是希望它会为您完成。