【问题标题】:Parallel.ForEach used with NHibernate resulting in SQL Server locksParallel.ForEach 与 NHibernate 一起使用导致 SQL Server 锁
【发布时间】:2016-03-01 17:06:33
【问题描述】:

首先,我不是多线程和并行编程方面的专家。

我正在尝试优化旧应用程序的性能(.Net 4NHibernate 2.1)。

**到目前为止,升级NHibernate 不是优先事项,但正在筹备中。

随着时间的推移,随着数据的增长,性能已经成为一场噩梦。我见过的一个项目是 Parallel.ForEach 语句,它调用了一个获取和更新复杂实体(具有多个关系 - 属性和集合)的方法。

这段代码具有以下形式(为清楚起见进行了简化):

void SomeMethod(ICollection<TheClass> itemsToProcess)
{
   Parallel.ForEach(itemsToProcess, item => ProcessItem(item);
}

TheClass ProcessItem(TheClass i)
{
   var temp = NHibernateRepository.SomeFetchMethod(i);
   var result = NHibernateRepository.Update(temp);
   return result;
}

SQL Server 间歇性地报告数据库锁定错误,错误如下:

Transaction (Process ID 20) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction

我怀疑这是由于某些竞争条件导致了死锁,即使 ISessions 是分开的。

ICollection&lt;TheClass&gt; 最多可以有 1000 个项目,每个项目都有要处理的属性和子集合,生成许多 SELECTUPDATE 语句(使用“NHibernate Profiler”确认)

有没有更好的方法来并行处理这个问题,还是我应该将代码重构为传统循环?

我确实知道我可以使用以下方式实现我的代码:

  1. foreach 循环在同一 ISession 上下文中
  2. 使用无状态会话
  3. Environment.BatchSize 设置为合理的值

  1. 使用 SQL BulkCopy

我还阅读了很多关于 SQL Server 死锁和Parallel.ForEach 是一个简单的陷阱的好信息:

  1. SQL Transaction was deadlocked
  2. Using SQL Bulk Copy as an alternative
  3. Potential Pitfalls in Data and Task Parallelism
  4. Multi threading C# application with SQL Server database calls

【问题讨论】:

    标签: c# sql-server multithreading .net-4.0 nhibernate-4


    【解决方案1】:

    这是一个非常复杂的话题。有一种策略可以保证安全并且可能会导致加速:

    在死锁的情况下重试。

    由于死锁会回滚事务,因此您可以安全地重试整个事务。如果死锁率低,则并行加速会高。

    重试的好处是您可以在中心位置进行简单的代码更改。

    由于从发布的代码中看不出来:确保线程不共享会话或实体。它们都不是线程安全的。

    【讨论】:

    • 感谢您的意见。这确实很复杂,可能的解决方案是多管齐下的。将尝试您的重试策略。另一个增加更多扳手的复杂性是由于NHibernate 密钥生成策略而在某些实体上发生的多个SELECTSUPDATES。正如我提到的,这些线程确实共享同一个会话
    • 如果 NHibernate 正确执行,hilo 密钥生成应该在单独的事务中发生。不应该有涉及到的僵局。您可以使用 SQL Profiler 进行检查。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-21
    • 1970-01-01
    相关资源
    最近更新 更多