2016-07-29 57 views
1

当使用卤面与NHibernate,同时存储用户的细节在表中获取错误,如无法与会话级NHibernate和卤面的并发性问题同步数据库状态

NHibernate.Event.Default.AbstractFlushingEventListener 

NHibernate.AdoNet.TooManyRowsAffectedException: Unexpected row count: 5; expected: 1 
    at NHibernate.AdoNet.Expectations.BasicExpectation.VerifyOutcomeNonBatched(Int32 rowCount, IDbCommand statement) 
    at NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id, Object[] fields, Object[] oldFields, Object rowId, Boolean[] includeProperty, Int32 j, Object oldVersion, Object obj, SqlCommandInfo sql, ISessionImplementor session) 
    at NHibernate.Persister.Entity.AbstractEntityPersister.UpdateOrInsert(Object id, Object[] fields, Object[] oldFields, Object rowId, Boolean[] includeProperty, Int32 j, Object oldVersion, Object obj, SqlCommandInfo sql, ISessionImplementor session) 
    at NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id, Object[] fields, Int32[] dirtyFields, Boolean hasDirtyCollection, Object[] oldFields, Object oldVersion, Object obj, Object rowId, ISessionImplementor session) 
    at NHibernate.Action.EntityUpdateAction.Execute() 
    at NHibernate.Engine.ActionQueue.Execute(IExecutable executable) 
    at NHibernate.Engine.ActionQueue.ExecuteActions(IList list) 
    at NHibernate.Engine.ActionQueue.ExecuteActions() 
    at NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource session) 

这可能会发生由于所有用户的并发性,因为如果我使用调试器,随着足够的时间流逝,它会意外地工作。

获取例外此代码

public void Insert(ISagaData sagaData, string[] sagaDataPropertyPathsToIndex) 
     { 
      try 
      { 
       var nSagaData = new NDbSagaData 
       { 
        Id = sagaData.Id, 
        Revision = sagaData.Revision++, 
        Data = JsonConvert.SerializeObject(sagaData, Formatting.Indented, Settings) 
       }; 
       PersistenceManager.Save(nSagaData); 
      } 
      catch (Exception ex) 
      { 
       _log.Error("Insert Exception " + ex.Message); 
       System.IO.File.AppendAllText("C:\\TestFolder\\WriteText.txt", "Insert fromSource - " + ex.Message); 
       throw new OptimisticLockingException(sagaData, ex); 
      } 
     } 

和它说,“意外的行数:3;预计:1'

会是什么原因?

+0

你知道这个问题出了什么问题吗? – mookid8000

+0

@ mookid8000是的,实际上由于编码错误,GUID存储多次。所以它是3行/ 2行。现在解决了。谢谢。 –

+0

如果您将问题标记为回答,那就太好了 - 这样,就可以看到Rebus问题最终得到了答案:) – mookid8000

回答

0

它看起来像你已经实现了一个基于NHibernate的传奇persister,它似乎像检测到竞争条件,我猜测导致回滚事务。

我想问的是为什么发生了一个竞态条件。当NHibernate的乐观并发检查失败时,会出现“意外的行数”异常,但在这种情况下,我会预期会有一条消息提示“意外的行数0;预期的1”。

如果我是你,我会使用Rebus的内置SQL Server传奇persister,因为看起来你正在序列化saga数据到单个列中。