Nhibernate事务问题 - IsolationLevel.Serializable

时间:2011-03-28 08:44:37

标签: nhibernate s#arp-architecture

我的任务需要很长时间。所以我想让几个程序/线程/计算机执行相同的任务来加快速度。每个任务都需要存储在数据库中的唯一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();

不幸的是,如果多个进程访问数据库(nr已删除的对象与批量大小不同),则会在一段时间后抛出异常。为什么是这样? db的隔离级别应该没问题呢?感谢。

祝福,

基督教

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我不确定我是否明白你在这做什么。看起来每个进程都应该使用一些id并处理它们,但是没有两个进程应该采用相同的方法。

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

分配负载并不容易。你可以

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