我在尝试使用多个线程调用同一个方法时,遇到了以下错误:连接已经处于事务中,无法参与另一个事务。EntityClient不支持并行事务。
在 MarketLogic 类中,使用 SavePosition() 方法将信息保存到数据库中,使用了 Entity Framework DbContext 的 (SaveChanges()) 方法。
在我的情况下,当有2个或更多线程尝试调用 new MarketLogic().SavePosition() 时,问题就会发生。
我可以看到,在第一个事务还没有完成的情况下,第二个线程进来并开始了一个新的事务。 但是我不明白为什么2个线程在不同的DbContext对象中,但错误仍然发生。 那么问题出在哪里?或者我错过了什么?
我发现我的问题与此类似:Entity Framework的SqlException - 新事务不允许,因为会话中有其他线程正在运行
我的场景: 我有一个被多个线程实例化的类,每个线程-新实例:
public MarketLogic()
{
var dbContext = new FinancialContext();
AccountBalanceRepository = new AccountBalanceRepository(dbContext);
CompositeTradeRepository = new CompositeTradeRepository(
new OrderRepository(dbContext)
, new PositionRepository(dbContext)
, new TradeRepository(dbContext));
CompositeRepository = new CompositeRepository(
new LookupValueRepository(dbContext)
, new SecurityRepository(dbContext)
, new TransactionRepository(dbContext)
, new FinancialMarketRepository(dbContext)
, new FinancialMarketSessionRepository(dbContext)
);
}
在 MarketLogic 类中,使用 SavePosition() 方法将信息保存到数据库中,使用了 Entity Framework DbContext 的 (SaveChanges()) 方法。
private void SavePosition()
{
using (DbContextTransaction transaction = CompositeTradeRepository.OrderRepository.DbContext.Database.BeginTransaction())
{
try
{
// business logic code, **this take some times to complete**.
position = EntityExistsSpecification.Not().IsSatisfiedBy(position)
? CompositeTradeRepository.PositionRepository.Add(position)
: CompositeTradeRepository.PositionRepository.Update(position);
transaction.Commit();
}
catch (Exception exception)
{
// some code
transaction.Rollback();
}
}
}
public Position Add(Position position)
{
// some code
// context is a instance of FinancialContext, this class is generated by Entity Framework 6
context.SaveChanges();
}
在我的情况下,当有2个或更多线程尝试调用 new MarketLogic().SavePosition() 时,问题就会发生。
我可以看到,在第一个事务还没有完成的情况下,第二个线程进来并开始了一个新的事务。 但是我不明白为什么2个线程在不同的DbContext对象中,但错误仍然发生。 那么问题出在哪里?或者我错过了什么?