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块。这不是事实。当在using块内部未处理异常时,事务会自动回滚。这适用于现有实现和我所描述的实现。有关更多详细信息,请参见“完成事务范围”部分的此处。
更新2:我最终理解了答案中所解释的内容。这不是语言结构,可以按照语言设计人员的任意方式进行解释-它是IDisposable模式的实现。如果没有调用Complete,Dispose方法内的代码将无法知道它是因为在成功执行using块内的代码还是因为发生了异常而被调用。我想象了类似以下代码的东西,其中transaction和rollback都是关键字。
transaction
{
/* Perform transactional work here */
if(problemOccurred)
{
rollback;
}
}
当然,如果事务选项需要传递给TransactionScope,则会出现问题。