2009-02-06 32 views
3

我正在處理一個用相當多的數據管理複雜「事件」的大型應用程序。多個同時保存導致WCF/NHibernate「由另一個事務更新的行」

該應用程序被分解爲一個客戶端(主要是C#主要是.NET 2.0),一個基於WCF的服務器在IIS上運行(在此層的Web服務),以及一個基於MS SQL的NHibernate數據後端服務器數據庫後端。

我們遇到的錯誤與後續的情景:

多個用戶(在這種情況下6,在我們的測試),同時在客戶端保存持久化對象(如事件)。 (這是通過口頭倒計時完成的,所以我們談論的是由於反應時間造成的差異)

當他們在客戶端上保存對象時,客戶端調用服務器來保存該對象。服務器執行所需的任何業務邏輯,然後通過NHibernate提交更改。

在此情況下(多節省超過服務調用)有些客戶會回來與unhanded例外:

「行被更新或者被另一個事務刪除」

這是一個NHibernate的例外。

在我的研究中,我發現了這個錯誤的一些實例,但它總是順序的。我們的應用順序很好,這隻發生在同時保存。

多個同時進行的NHibernate事務應該如何互相保護?

(這將是一個高容量的應用程序,所以最少需要的鎖還是不錯的。我們不能鎖定所有一般的撲救。)

是否有NHibernate的設置,將做到這一點?我們是否需要事先弄清楚一些服務器端代碼的鎖定?數據庫可以用不同的事務保護設置來處理這個問題嗎?

這是一個測試的熊,像大多數線程問題一樣,因此是研究/理論方法。什麼是這樣的架構體驗?

編輯:進一步的信息和理論。

看起來,直接在表格中作爲主要實體更改值並不會導致此問題,同時更改通過連接訪問的元素。 (在這種情況下是一組屬性)。

似乎符合這一情況

我們的工作原理是這樣的:

多節省進來同一事件。每一個獲得現有事件的副本(修改)。首先要保存的是確定的。然而,後面的更新會增加或刪除屬性(這是一個連接表),並發現需要完成的添加或刪除操作已經完成,並且由於另一個事務編輯了事件而退出。

我們應該如何保持這些事件同步?

回答

1

我對於多線程的單用戶應用程序有同樣的問題。關鍵是用[ThreadSafe]裝飾我的會話變量。奇怪的是,我看過的各種會議管理者似乎都沒有這樣做,他們認爲他們自動安全線程......並不是我的經驗。

Asp Session Manager

Multi DB Session

1

我接受了上述答案,因爲它或多或少與我們去了路線。我想進一步闡述。我們的應用程序旨在大量使用,因此徹底鎖定「更新主要實體」過程是一個不好的主意。

我們最終做的是使用C#互斥鎖,以「獨特的東西」鎖定,在這種情況下是事件ID。這意味着對同一複雜實體的任何操作都將被鎖定,並在此意義上變成「原子」。這解決了我們的問題。我們或多或少地通過一個互斥體(通過現有的實用程序類)將每一個「破壞性」服務操作都包裝在一個互斥體中。

相關問題