当我尝试在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在事务范围内,是否可能是原因?如果是的话,如果需要,可以采用哪种替代方案?
答案 0 :(得分:1)
这种异常是由几个原因造成的,例如事务超时,在彼此内部嵌套两个事务,在事务范围内部有两个开放连接,对整个Web应用程序使用单个DbContext
实例,因此DbContext拥有它UOF,由于某种原因,主题之间可能会发生一些冲突。您可以使用System.Transactions.Transaction.Current.TransactionInformation.Status
来识别事务的状态,并在抛出异常之前将其中止。
将return new TransactionScope(TransactionScopeOption.Required, tOptions);
更改为return new TransactionScope(TransactionScopeOption.RequiresNew, tOptions);
并再次测试,看看会发生什么。