据我了解,使用a的“正确”方法TransactionScope是始终transactionScope.Complete();在退出using块之前调用。像这样:
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(); }
但是,我已经看到,没有它,代码就可以工作,甚至我从中也学会了使用它的答案 。所以我的问题是,是否必须使用它?
所以我的问题是,是否必须使用它?
Complete为了进行COMMIT交易而进行更新时必须使用。否则,事务管理器将发出ROLLBACK并撤消所做的更改。
Complete
COMMIT
ROLLBACK
对于像您的示例这样的只读事务,无论有没有,我都认为没有实质性的区别Complete。在这两种情况下,由事务管理器发出的COMMIT或ROLLBACK都会具有释放事务所持有的锁和资源的相同净效果。
尽管不要求Complete在只读事务中进行调用,但它仍然是IMHO的最佳实践。考虑一下这个可怜的开发人员,该开发人员后来在不知不觉Complete中丢失了数据修改代码到您的事务块中。