Nhibernate事务问题-IsolationLevel.Serializable
我有一项任务要花很长时间。因此,我想让几个程序/线程/计算机执行相同的任务,以加快速度。每个任务都需要存储在db中的唯一ID–因此我认为这些ID可以如下获得: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
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的中央服务