我正在處理一個用相當多的數據管理複雜「事件」的大型應用程序。多個同時保存導致WCF/NHibernate「由另一個事務更新的行」
該應用程序被分解爲一個客戶端(主要是C#主要是.NET 2.0),一個基於WCF的服務器在IIS上運行(在此層的Web服務),以及一個基於MS SQL的NHibernate數據後端服務器數據庫後端。
我們遇到的錯誤與後續的情景:
多個用戶(在這種情況下6,在我們的測試),同時在客戶端保存持久化對象(如事件)。 (這是通過口頭倒計時完成的,所以我們談論的是由於反應時間造成的差異)
當他們在客戶端上保存對象時,客戶端調用服務器來保存該對象。服務器執行所需的任何業務邏輯,然後通過NHibernate提交更改。
在此情況下(多節省超過服務調用)有些客戶會回來與unhanded例外:
「行被更新或者被另一個事務刪除」
這是一個NHibernate的例外。
在我的研究中,我發現了這個錯誤的一些實例,但它總是順序的。我們的應用順序很好,這隻發生在同時保存。
多個同時進行的NHibernate事務應該如何互相保護?
(這將是一個高容量的應用程序,所以最少需要的鎖還是不錯的。我們不能鎖定所有一般的撲救。)
是否有NHibernate的設置,將做到這一點?我們是否需要事先弄清楚一些服務器端代碼的鎖定?數據庫可以用不同的事務保護設置來處理這個問題嗎?
這是一個測試的熊,像大多數線程問題一樣,因此是研究/理論方法。什麼是這樣的架構體驗?
編輯:進一步的信息和理論。
看起來,直接在表格中作爲主要實體更改值並不會導致此問題,同時更改通過連接訪問的元素。 (在這種情況下是一組屬性)。
似乎符合這一情況我們的工作原理是這樣的:
多節省進來同一事件。每一個獲得現有事件的副本(修改)。首先要保存的是確定的。然而,後面的更新會增加或刪除屬性(這是一個連接表),並發現需要完成的添加或刪除操作已經完成,並且由於另一個事務編輯了事件而退出。
我們應該如何保持這些事件同步?