我正在使用使用Entity Framework的系统,我在TransactionScope中包含一个调用但仅因为我想将IsolationLevel设置为ReadUncommited(基本上是在做NOLOCK) ,如one of the answers here中所述。 这只是一个查询,不会更改任何数据。
using (var scope = new TransactionScope(TransactionScopeOption.Required,
new TransactionOptions() { IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted }))
{
List<T> toReturn = query.ToList();
scope.Complete();
return toReturn;
}
我的理解是调用Complete()就像执行SQL提交一样。如果我不调用scope.Complete(),会发生什么?这只是一个数据库查询,因此无需提交。
答案 0 :(得分:1)
如果您未调用complete,则会回滚范围内的事务。完成后你必须明确打电话。如果您不想,则不必调用Rollback。
答案 1 :(得分:1)
你必须这样做。Complete
方法提交交易。如果抛出exception
,则不会调用Complete
,并且交易为rolled back
。
如果您对范围内的所有操作都感到满意 成功完成后,您应该只调用此方法一次 告知事务管理器所有资源的状态是 一致,并且可以提交事务。这很棒 练习将调用作为using块中的最后一个语句。 未能调用此方法会中止事务,因为 事务管理器将此解释为系统故障或异常 抛出交易范围。但是,您还应该注意 调用此方法并不能保证提交 交易。它只是一种通知交易管理器的方式 你的身份。调用此方法后,您将无法再访问 环境事务通过Current属性,并尝试这样做 导致抛出异常。