nhibernate重试如何在死锁中管理会话

时间:2011-07-07 11:22:10

标签: nhibernate

我一直遇到死锁问题。我一直在做一些重试方法。我的重试代码目前仅适用于'尝试5次的声明。我知道我需要使用' Evit' nhibernate方法来清除会话。我正在使用会话工厂并为每个请求使用事务。

在下面的例子中,如果我在第一次重试时遇到死锁,那么第二次重试时orderNote属性是否保持不变?

private ActionResult OrderDetails(int id)
{
    var order = _orderRepository.Get(id);
    order.OrderNote = "will this text remain";

    Retry.Times(5).Do(() => _orderRepository.Update(order));

    return View();
}

修改

1)发现难以追查原因。我的应用程序每天都会获得大约10个锁。只需设置一个分析器。是否还有其他有用的跟踪方法

http://msdn.microsoft.com/en-us/library/ms190465.aspx

我认为主要问题是我使用自动增量。我正在搬到希洛。

2)使用不同的转换模式。我此刻没有定义任何内容。什么是推荐。

5)长时间运行。是的,我愿意。而且我认为因为我使用自动增量延迟加载被忽略了。这听起来不错吗?

1 个答案:

答案 0 :(得分:3)

在我看来,您的代码正试图修复症状而不是原因。

您最好做以下事情:

  1. 找出解决僵局的原因并解决核心问题
  2. 使用其他交易模式阅读过去的锁
  3. 查看将更新委派给队列结构进行后台处理
  4. 了解更新执行计划,并可能添加索引以加快查询速度
  5. 您的Controller操作中是否有“长期”运行操作,这使得事务保持打开时间超过应有的时间?
  6. 即使操作确实发生了死锁,为什么不将友好错误返回到调用页面并让他们手动重试。
  7. 更新

    1。)有用的跟踪方法

    我已经使用此方法来跟踪死锁,这可以让您了解争用的资源:Tracing Deadlocks

    您还可以查看可用的concurreny模型:NHibernate Concurrency

    2。)事务隔离级别

    根据您的数据库,此问题包含一些有用的信息:Transaction Isolation Mode

    3。)长时间运行

    我必须使用Identity Columns作为我在NHibernate中的主键,我不认为这些会在更新方案中成为您的问题的根源,因为此时已经设置了Id / PK。尽量减少长时间运行操作,这会缩短交易开放的时间。