首页 新闻 赞助 找找看

Spring.net+Nhibernate 一直报Enumerator was modified的错误

0
悬赏园豆:100 [待解决问题]

查资料说是多线程导致的问题,但这边的配置都是spring.Net提供的

发生了未经处理的异常,已终止进程。 Application ID: /LM/W3SVC/1/ROOT Process ID: 11168 Exception: System.InvalidOperationException Message: Enumerator was modified StackTrace: 在 NHibernate.Util.SequencedHashMap.OrderedEnumerator.MoveNext() 在 NHibernate.Engine.StatefulPersistenceContext.AfterTransactionCompletion() 在 NHibernate.Impl.SessionImpl.AfterTransactionCompletion(Boolean success, ITransaction tx) 在 NHibernate.Transaction.AdoNetWithDistributedTransactionFactory.<>c__DisplayClass1.<EnlistInDistributedTransactionIfNeeded>b__0(Object sender, TransactionEventArgs e) 在 System.Transactions.TransactionCompletedEventHandler.Invoke(Object sender, TransactionEventArgs e) 在 System.Transactions.InternalTransaction.FireCompletion() 在 System.Transactions.TransactionStatePromotedCommitted.EnterState(InternalTransaction tx) 在 System.Transactions.TransactionStatePromotedBase.ChangeStatePromotedCommitted(InternalTransaction tx) 在 System.Transactions.InternalTransaction.DistributedTransactionOutcome(InternalTransaction tx, TransactionStatus status) 在 System.Transactions.Oletx.RealOletxTransaction.FireOutcome(TransactionStatus statusArg) 在 System.Transactions.Oletx.OutcomeEnlistment.InvokeOutcomeFunction(TransactionStatus status) 在 System.Transactions.Oletx.OletxTransactionManager.ShimNotificationCallback(Object state, Boolean timeout) 在 System.Threading._ThreadPoolWaitOrTimerCallback.PerformWaitOrTimerCallback(Object state, Boolean timedOut)

问题补充:

//Nhibernate异常
//可能原因:Nhibernate中Session多线程下异常
//替代方案:暂停线程
System.Threading.Thread.Sleep(500);

目前只有2个地方有出现异常,暂时这样来解决,但希望能有真正的解决方案

天命辉煌的主页 天命辉煌 | 初学一级 | 园豆:10
提问于:2015-08-30 11:15
< >
分享
所有回答(1)
0

应该是集合已经修改无法操作的错误,你查找下是不是在对集合循环的时候,是否对其进行添加或者移除的操作了。如果有这样的操作就会出现这个错误。

wolfy | 园豆:2636 (老鸟四级) | 2015-08-30 11:36

没有的,只是在事务里面保存对象

using (TransactionScope scope = new TransactionScope())
{
  for (int i = 0; i < DetailList.Count; i++)
  {
    if (!string.IsNullOrEmpty(nextStep))
      UserRepository.SaveOrUpdate(attends[i]);
    UserDetail.Save(DetailList[i]);
  }
  UserInfoRepository.Save(FillCard);

  scope.Complete();

}

支持(0) 反对(0) 天命辉煌 | 园豆:10 (初学一级) | 2015-08-30 11:58

@天命辉煌: nextStep IEnumaerator 实现该接口的 有可能是延迟加载的问题导致的,实现该接口的集合只有在使用的时候才去查询,你是不是对该集合对应的表进行了新的插入操作。你第一次可以,第二次再使用该对象的时候,它会再次进行查询,所以出现这种错误,我也是猜测,这问题,不好排查。

支持(0) 反对(0) wolfy | 园豆:2636 (老鸟四级) | 2015-08-30 12:06

@wolfy: 没有延迟加载,nextStep是传过来的string参数,而且同样的写法别的地方都不会报错,也没办法跟踪到异常,纠结好几天了

支持(0) 反对(0) 天命辉煌 | 园豆:10 (初学一级) | 2015-08-30 12:08
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册