如果我在进行查询时没有完成()我的TransactionScope,会发生什么?

时间:2016-04-29 23:44:56

标签: .net entity-framework

我正在使用使用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(),会发生什么?这只是一个数据库查询,因此无需提交。

2 个答案:

答案 0 :(得分:1)

如果您未调用complete,则会回滚范围内的事务。完成后你必须明确打电话。如果您不想,则不必调用Rollback。

https://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.complete(v=vs.110).aspx

答案 1 :(得分:1)

你必须这样做Complete方法提交交易。如果抛出exception,则不会调用Complete,并且交易为rolled back

  

如果您对范围内的所有操作都感到满意   成功完成后,您应该只调用此方法一次   告知事务管理器所有资源的状态是   一致,并且可以提交事务。这很棒   练习将调用作为using块中的最后一个语句。   未能调用此方法会中止事务,因为   事务管理器将此解释为系统故障或异常   抛出交易范围。但是,您还应该注意   调用此方法并不能保证提交   交易。它只是一种通知交易管理器的方式   你的身份。调用此方法后,您将无法再访问   环境事务通过Current属性,并尝试这样做   导致抛出异常。