2016-07-29 19 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數據到單個列中。