TransactionScope期望按如下方式调用其Complete方法。否则,交易将不会被提交。为什么TransactionScope不会成功?
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模式的实现。如果没有调用完成Dispose方法内的代码,则不知道它是否被调用,因为正在成功执行using块中的代码或发生异常。我想象的事物和回滚都是关键字。
transaction
{
/* Perform transactional work here */
if(problemOccurred)
{
rollback;
}
}
如果事务选项需要传递给TransactionScope,这当然会出现问题。
为什么不是我的评论自动添加当我改变页面,我不应该单击[添加评论] ... – cjk 2010-01-04 13:20:37
从更新 - * *机制,通过该交易在例外的脸回滚是你在不调用Commit的情况下到达使用块的末尾。即该行为取决于您要删除的确切功能。 – 2010-01-04 14:12:55
你的“更新”是指当前的游戏状态 - 如果TransactionScope假定成功,你会改变这种情况。 – 2010-01-04 14:15:01