Nhibernate:生成insert然后更新语句,在多线程环境中导致死锁问题

时间:2010-09-27 16:23:04

标签: nhibernate transaction-isolation

在将NHibernate与SQL Server 2005一起使用时,我遇到了以下情况。

我的业务流程涉及以下步骤:

  1. 开始交易
  2. 创建nhibernate映射对象
  3. 保存nhibernate映射对象
  4. 执行其他业务工作流程步骤
  5. 在步骤2中更新nhibernate映射对象
  6. 提交交易
  7. 在单线程环境中,这很好用。但是,当运行多线程负载测试时,在不同的实体上执行相同的用例,我发现我遇到了许多死锁。事务隔离级别保留在read committed的默认设置上。

    经过调查,我发现问题的原因是nhibernate发出了插入物和插入物。在步骤2和步骤2中创建的实体的更新声明在第5步中更新。从进一步测试中我了解到更新语句是锁定整个表格&不仅仅是正在更新的行,当另一个线程尝试访问表以进行插入或更新时,这会导致死锁。

    Q1:是否可以让nhibernate锁定它正在更新的行,即在发布更新时应用行锁?

    到目前为止,我还没有找到一种方法来让nhibernate只运行一个insert语句而不是insert和then语句。

    Q2:有没有人知道改变这种行为的配置选项?

    我已经设法通过在SQL Server数据库上启用快照隔离并将事务隔离级别设置为快照来克服多线程负载测试中发生的死锁问题。

    我很想知道是否有人遇到任何类似的问题。

1 个答案:

答案 0 :(得分:1)

你必须照顾好这一点。建议尽可能进行最小的交易(持续时间)。如果不可能,请确保以相同的顺序更新表以避免死锁。

如果真的不可能,请在配置中更改您的事务隔离设置,但不建议这样做。