【发布时间】:2010-01-04 13:15:24
【问题描述】:
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();
}
}
请注意,problemOccurred 标志仅在问题未导致异常的情况下才需要。在这种情况下,将自动执行回滚。
我有兴趣进一步了解为什么使用此实现。
更新:到目前为止,一些答案认为如果使用我描述的实现,则需要一个 try-catch 块。不是这种情况。当使用块中未处理异常时,事务会自动回滚。现有实现和我描述的实现都是这种情况。有关详细信息,请参阅“完成事务范围”部分 here。
更新 2: 我终于明白答案中的解释了。这不是一种语言结构,可以以任何语言设计者认为合适的方式解释 - 它是 IDisposable 模式的实现。如果没有调用 Complete,Dispose 方法中的代码将不知道调用它是因为 using 块中的代码成功执行还是因为发生了异常。我在想像下面这样的东西,其中事务和回滚都是关键字。
transaction
{
/* Perform transactional work here */
if(problemOccurred)
{
rollback;
}
}
如果需要将事务选项传递给 TransactionScope,这当然会出现问题。
【问题讨论】:
-
为什么我换页时没有自动添加评论,我不应该点击[添加评论]...
-
From update - 在遇到异常时回滚事务的机制是您在没有调用 Commit 的情况下到达 using 块的末尾。 IE。该行为取决于您要删除的确切功能。
-
您的更新是错误的 - 它当前回滚的唯一原因是正是您所抱怨的行为。它假设失败 - 如果发生异常,Complete() 永远不会被调用,因此事务失败。没有其他神奇的机制可以捕捉异常。
-
@Scott - 尝试自己实现这个 - 你所要做的就是实现一个实现 IDisposable 的类,并且在 Dispose 方法中,你必须确定你是否因为一个异常被传播 - 你会意识到为什么它不起作用。
-
谢谢达米安。我认为 TransactionScope 是一种语言结构,可以按照语言设计者决定的任何方式进行解释,但它只不过是 IDisposable 的实现。
标签: .net transactionscope