Nhibernate 跨事务维护更新顺序以避免死锁

Nhibernate 跨事务维护更新顺序以避免死锁,nhibernate,Nhibernate,nhibernate是否有一些方法来维护更新顺序,以避免并发事务之间的死锁 例如,如果我有两个事务T1和T2同时执行。假设我正在更新一个名为order的表中的两行,其中一个字段名为cancelled T1 T2 显然,如果它们同时执行或大约同时执行,上述操作将导致死锁,因为T1将等待获取订单2上的锁,T2将等待获取订单1上的锁 我的问题是如何确保这些更新的顺序始终相同?这仅仅是通过在两个事务中以相同的顺序更新实体来处理的吗 因此,如果我在实体上执行以下操作,是否可以保证更新将以正确的顺序进行 O

nhibernate是否有一些方法来维护更新顺序,以避免并发事务之间的死锁

例如,如果我有两个事务T1和T2同时执行。假设我正在更新一个名为order的表中的两行,其中一个字段名为cancelled

T1

T2

显然,如果它们同时执行或大约同时执行,上述操作将导致死锁,因为T1将等待获取订单2上的锁,T2将等待获取订单1上的锁

我的问题是如何确保这些更新的顺序始终相同?这仅仅是通过在两个事务中以相同的顺序更新实体来处理的吗

因此,如果我在实体上执行以下操作,是否可以保证更新将以正确的顺序进行

Order order1 = session.Get<Order>(1);
Order order2 = session.Get<Order>(2);

using(ITransaction tran = session.StartTransaction())
{
    order1.Cancelled = 0;
    order2.Cancelled = 0;
    tran.Commit();
}
Order order1=session.Get(1);
Order order2=session.Get(2);
使用(ITransaction tran=session.StartTransaction())
{
订单1.取消=0;
订单2.取消=0;
trans.Commit();
}
除此之外,我还想知道不同表之间的更新。因此,如果我要更新一个名为order的表,以及一个名为order_line的表,类似于上面的例子,nhibernate是否有一些自动方法每次都以相同的顺序进行更新

编辑 从v4开始,实体框架似乎在本机上支持这一点。以下文章对此进行了解释:

操作顺序
EF没有公开一种方法来控制 保存更改期间的操作顺序。efv1确实具有特异性 具有高隔离级别(例如可序列化)的问题 在保存更改期间产生死锁。这不是一个广为宣传的计划 功能,但在EF4中,我们更改了更新管道以使用更多 不相关CUD操作的确定性排序。这很有帮助 确保一个程序的多个实例将使用相同的顺序 更新同一组表时,这反过来有助于减少 僵局的可能性

除了保存更改,如果您需要具有高 隔离在执行查询时,您可以手动实现 类似的方法:确保应用程序始终访问相同的 以相同顺序排列的一对表,例如使用字母顺序

以上内容摘自

显然,2013年1月nhusers组中也有一篇关于此的帖子:
我想我是通过挖掘nhibernate代码找到答案的。答案是“是”和“否”。NHibernate确实能够对INSERT语句进行排序,但您必须通过以下方式在配置文件中手动设置此配置:

<property name="order_inserts">true</property>
请注意,并建议在NHibernate 4.1.0中公开订单更新(撰写本文时,最新版本为4.0.3)
Order order1 = session.Get<Order>(1);
Order order2 = session.Get<Order>(2);

using(ITransaction tran = session.StartTransaction())
{
    order1.Cancelled = 0;
    order2.Cancelled = 0;
    tran.Commit();
}
<property name="order_inserts">true</property>
public bool IsOrderUpdatesEnabled { get; internal set; }