gpt4 book ai didi

c# - DbContextTransaction 和多线程 : The connection is already in a transaction and cannot participate in another transaction

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

当我试图用多个线程调用相同的方法时出现这个错误:连接已经在一个事务中,不能参与另一个事务。 EntityClient 不支持并行事务。

我发现我的问题与此类似:SqlException from Entity Framework - New transaction is not allowed because there are other threads running in the session

我的场景:我有一个由多个线程实例化的类,每个线程 - 新实例:

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 对象中,但错误仍然发生

那么哪里出了问题?还是我错过了什么?

最佳答案

我的错,我将存储库保留为静态,因此所有线程共享相同的存储库,这意味着它们共享相同的 DbContext,这导致了当 EF 尚未完成允许更改并且对 SaveChanges() 进行其他调用时出现的问题.所以 EF 抛出了异常。

关于c# - DbContextTransaction 和多线程 : The connection is already in a transaction and cannot participate in another transaction,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22529467/

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