Nhibernate事务问题-IsolationLevel.Serializable

Nhibernate事务问题-IsolationLevel.Serializable,nhibernate,s#arp-architecture,Nhibernate,S#arp Architecture,我有一项任务要花很长时间。因此,我想让几个程序/线程/计算机执行相同的任务,以加快速度。每个任务都需要存储在db中的唯一ID–因此我认为这些ID可以如下获得: NHibernateSession.Current.BeginTransaction(IsolationLevel.Serializable); list = NHibernateSession.Current.CreateCriteria<RelevantId>().SetFirstResult(0).SetMaxResul

我有一项任务要花很长时间。因此,我想让几个程序/线程/计算机执行相同的任务,以加快速度。每个任务都需要存储在db中的唯一ID–因此我认为这些ID可以如下获得:

NHibernateSession.Current.BeginTransaction(IsolationLevel.Serializable);
list = NHibernateSession.Current.CreateCriteria<RelevantId>().SetFirstResult(0).SetMaxResults(500).List<RelevantId>();

foreach (RelevantId x in list)
{
RelevantIdsRepository.Delete(x);
}
NHibernateSession.Current.Transaction.Commit();
NHibernateSession.Current.BeginTransaction(IsolationLevel.Serializable);
list=NHibernateSession.Current.CreateCriteria().SetFirstResult(0.SetMaxResults(500.list));
foreach(列表中的相关ID x)
{
RelevantIdsRepository.Delete(x);
}
NHibernateSession.Current.Transaction.Commit();
不幸的是,如果多个进程访问数据库(已删除对象的nr与批大小不同),则这会在一段时间后引发异常。为什么会这样?db的隔离级别应该是正常的,不是吗?谢谢

致以最良好的祝愿


Christian

它运行缓慢的问题可能是由于在一个循环中执行多个SQL语句。
您应该看看是否无法删除一个批处理语句中的所有实体。

我不确定是否理解您在这里做的事情。看起来每个进程都应该使用一些ID并处理它们,但没有两个进程应该使用相同的ID

它不像你实现的那样工作。所有进程都在读取相同的ID。提交事务后,它们将从数据库中消失。在那之前,它们对每个人都是可见的。隔离级别仅确保其他事务在被删除后无法读取它们。但在那之前,他们都能读

分配负载不是那么容易。你可以

  • 在表中维护ID,其中每个进程将自己注册为执行者,并在启动前提交ID(处理冲突,例如StaleObjectStateException)。即使进程崩溃,也要确保将其清理干净
  • 编写一个分发ID的中央服务

那么,您是否建议这样的sql:从RelevantId中删除RelevantId,其中RelevantId位于(1,2,3…)中?尽管如此,它还是应该工作,即使很慢,因为隔离级别是否锁定了表?谢谢,这正是我的意思-但是最高的隔离级别序列化是否不会阻止您所说的(即所有进程都在读取相同的ID)?只是做了更多的阅读。序列化隔离级别不阻止读取是否正确?我想这就是你的意思?读取别人读取的数据在任何时候都不会被阻止。您不能读取其他人更改(或删除)的数据,也不能删除或更新其他人读取的数据,以确保可重复读取。