交易范围和实体框架内的工作单元

时间:2014-06-15 06:18:09

标签: c# entity-framework transactionscope unit-of-work

当我尝试在TransactionScope中保存实体时出现异常,我得到的例外是:

The operation is not valid for the state of the transaction

但是在另一台机器上,我在同一代码块上得到了一个不同的异常:

The transaction operation cannot be performed because there are pending requests working on this transaction

我的方法中的交易实施是:

    TransactionHelper.Transaction(() =>
    {
        if (sys.WfId.HasValue)
        {
            var sysData = GeneralMapping.GetSysData(model, ThisUser);
            DoAction(sys, model, sysData);

            if (!_sysClosed)
            {
                _Repository.InsertOrUpdate(sys);
                _Uow.Save();
            }
        }

    });

TransactionHelper

public static class TransactionHelper
{
    public static void HandleTransaction(Action action)
    {
        using (var tx = CreateScope())
        {
            action();
            tx.Complete();
        }
    }

    private static TransactionScope CreateScope(IsolationLevel isolationLevel = IsolationLevel.ReadCommitted)
    {
         var tOptions = new TransactionOptions
                                 {
                                     IsolationLevel = isolationLevel,
                                     Timeout = TransactionManager.MaximumTimeout
                                 };
         return new TransactionScope(TransactionScopeOption.Required, tOptions);
    }

}

这完全没有任何问题,但是最近在我开始看到这些异常后,我被告知这个实现可能会导致死锁,因为工作单元是一个事务(Business Transaction - {{3在事务范围内,是否可能是原因?如果是的话,如果需要,可以采用哪种替代方案?

1 个答案:

答案 0 :(得分:1)

这种异常是由几个原因造成的,例如事务超时,在彼此内部嵌套两个事务,在事务范围内部有两个开放连接,对整个Web应用程序使用单个DbContext实例,因此DbContext拥有它UOF,由于某种原因,主题之间可能会发生一些冲突。您可以使用System.Transactions.Transaction.Current.TransactionInformation.Status来识别事务的状态,并在抛出异常之前将其中止。

return new TransactionScope(TransactionScopeOption.Required, tOptions);更改为return new TransactionScope(TransactionScopeOption.RequiresNew, tOptions);并再次测试,看看会发生什么。