gpt4 book ai didi

c# - 事务范围和 Entity Framework 内的工作单元

转载 作者:行者123 更新时间:2023-11-30 17:47:47 24 4
gpt4 key购买 nike

当我尝试在 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();
}
}

});

交易助手:

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);
}

}

这工作得很好,没有任何问题,但是最近在我开始看到这些异常之后,有人告诉我这个实现可能会导致死锁,因为工作单元是一个事务(业务事务 - Martin Fowler ) 在交易范围内,这可能是原因吗?如果是这样,如果需要,替代实现方案是什么?

最佳答案

发生此异常的原因有多种,例如事务超时、两个事务相互嵌套、事务范围内的两个打开连接、对整个 Web 应用程序使用单个 DbContext 实例,因此 DbContext 有自己的 UOF ,由于某种原因,主题之间可能会发生一些冲突。您可以使用 System.Transactions.Transaction.Current.TransactionInformation.Status 来识别事务的状态,并且它在抛出异常之前被中止。

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

关于c# - 事务范围和 Entity Framework 内的工作单元,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24227080/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com