4

我们正在使用实体框架并在事务范围内运行单元测试。我们最初在标题中得到了错误。

我已经设法隔离了一些问题。

using (TransactionScope scope1 = new TransactionScope())
{
    using (TransactionScope scope2 = new TransactionScope())
    {
           // Here there is no code
    }

    using (Entities se = new Entities())
    {
        EntityConnection entityConnection = (EntityConnection)se.Connection;
        DbConnection storeConnection = entityConnection.StoreConnection;

        storeConnection.Open(); // On this line the error occurs

           // Some code that runs a stored procedure
    }
}

我们目前得到的错误是“该操作对事务状态无效..”

如果我删除事务范围2,一切正常。

如果我将范围 2 标记为环境事务,它也可以正常工作。

4

2 回答 2

9

您正在创建没有显式参数的 scope2 ,TransactionScopeOption这会产生默认值TransactionScopeOption.Required,请参阅备注部分TransactionScope Constructor

此构造函数创建一个新的事务范围,其事务范围选项等于必需。这意味着新范围需要一个事务,如果环境事务已经存在,则使用环境事务。否则,它会在进入范围之前创建一个新事务。

在您的示例中,环境TransactionScope确实已经存在( ),因此具有隐式参数scope1的新嵌套TransactionScope( )使用现有的环境事务而不是创建新事务本身。scope2TransactionScopeOption.Required

但是, 的隐式事务语义scope2仍然存在,因此由创建的现有环境事务scope1正在中止,因为您没有Complete在结束时调用scope2

调用此方法失败会中止事务,因为事务管理器将此解释为系统故障,或等效于事务范围内抛出的异常

当然,如果您删除scope2或将其语义更改为TransactionScopeOption.RequiresNew(意思是“始终为范围创建新事务”),问题会立即消失,因为由创建的现有环境事务scope1将不再受到影响。

有关这方面的更多详细信息,请参阅使用事务范围实现隐式事务

于 2009-08-28T00:49:47.977 回答
0

这个语法怎么样,这很相似,Scope2 是 Completed and Disposed 的。

我还间歇性地看到“无法访问已处理的对象'Transaction'错误。可能是因为我应该使用 TransactionScopeOption.RequiresNew 而不是 TransactionScopeOption.Required 创建这两个?

 TransactionOptions rootOptions = new TransactionOptions();
    rootOptions.IsolationLevel = IsolationLevel.ReadCommitted;
    OtherObject.Scope2 = new TransactionScope(TransactionScopeOption.Required, rootOptions);

    TransactionOptions options = new TransactionOptions();
    options.IsolationLevel = IsolationLevel.ReadCommitted;
    options.Timeout = getTransactionTimeout();
    using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, options))
                {

                                .............
                    scope.Complete();
                }
于 2009-09-15T15:23:23.667 回答