我一直遇到死锁问题。我一直在做一些重试方法。我的重试代码目前仅适用于'尝试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)长时间运行。是的,我愿意。而且我认为因为我使用自动增量延迟加载被忽略了。这听起来不错吗?
答案 0 :(得分:3)
在我看来,您的代码正试图修复症状而不是原因。
您最好做以下事情:
更新
1。)有用的跟踪方法
我已经使用此方法来跟踪死锁,这可以让您了解争用的资源:Tracing Deadlocks
您还可以查看可用的concurreny模型:NHibernate Concurrency
2。)事务隔离级别
根据您的数据库,此问题包含一些有用的信息:Transaction Isolation Mode
3。)长时间运行
我必须使用Identity Columns作为我在NHibernate中的主键,我不认为这些会在更新方案中成为您的问题的根源,因为此时已经设置了Id / PK。尽量减少长时间运行操作,这会缩短交易开放的时间。