据我了解,使用TransactionScope的“正确”方法是始终在退出transactionScope.Complete();块之前调用using。像这样:

using (TransactionScope transactionScope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.ReadUncommitted }))
{
    //...
    //I'm using this as a NOLOCK-alternative in Linq2sql.
    transactionScope.Complete();
}

但是,我已经看到,没有它,代码就可以工作,甚至the answer I've learnt to use it from都忽略了它。所以我的问题是,是否必须使用它?

最佳答案



在进行更新时必须使用Complete以便对事务进行COMMIT。否则,事务管理器将发出ROLLBACK并撤消所做的更改。

对于像您的示例这样的只读事务,无论是否使用Complete,我都认为没有实质性的区别。在这两种情况下,事务管理器发出的COMMITROLLBACK具有释放事务持有的锁和资源的相同净效果。

尽管不要求在只读事务中调用Complete,但它仍然是IMHO的最佳实践。考虑一下可怜的开发人员,该开发人员后来在不知不觉中缺少Complete的情况下,无意中将数据修改代码添加到了您的事务块中。

关于c# - 我需要 "transactionScope.Complete();"吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53657509/

10-16 08:52