TransactionScope 期望调用其 Complete 方法,如下所示。否则不会提交事务。
using(TransactionScope scope = new TransactionScope())
{
/* Perform transactional work here */
scope.Complete();
}
假设成功的实现不是更合适吗?这意味着在标准情况下(成功)需要更少的代码。
如果出现异常或调用诸如“回滚”之类的方法(此方法当前不存在),则可以回滚事务。
using(TransactionScope scope = new TransactionScope())
{
/* Perform transactional work here */
if(problemOccurred)
{
scope.Rollback();
}
}
请注意,仅在问题未导致异常的情况下才需要 questionOccurred 标志。在这种情况下,将自动执行回滚。
我有兴趣进一步了解为什么使用此实现。
更新:到目前为止,一些答案认为如果使用我描述的实现,则需要一个 try-catch 块。不是这种情况。当使用块中未处理异常时,事务会自动回滚。现有实现和我描述的实现都是这种情况。有关详细信息,请参阅此处的“完成事务范围”部分。
更新2:我终于明白答案中的解释了。这不是一种语言结构,可以以任何语言设计者认为合适的方式解释 - 它是 IDisposable 模式的实现。如果没有调用 Complete,Dispose 方法中的代码将不知道调用它是因为 using 块中的代码成功执行还是因为发生了异常。我在想像下面这样的东西,其中事务和回滚都是关键字。
transaction
{
/* Perform transactional work here */
if(problemOccurred)
{
rollback;
}
}
如果需要将事务选项传递给 TransactionScope,这当然会出现问题。