2016-01-15 47 views
1

我目前面臨以下問題:
我有一個C#.NET應用程序連接到數據庫(使用NHibernate)。該應用程序基本上顯示數據庫內容並讓用戶編輯它。由於應用程序的多個實例同時運行(在相同和不同的工作站上),只要兩個用戶同時修改相同的記錄,我就會遇到併發問題。數據庫或用戶級鎖

目前我有點解決樂觀鎖定的問題。但是這並不是一個完美的解決方案,因爲一個用戶仍然失去了它的改變。

現在我想出了讓應用程序在每次從數據庫加載新條目時鎖定一個條目並在用戶切換到另一個條目後立即釋放鎖定的想法。所以基本上所有當前顯示給用戶的條目都被鎖定在數據庫中。如果另一個用戶加載鎖定的條目,它將以只讀模式顯示它們。

現在我的真正的問題:
在數據庫級別上進行鎖定是一個好主意嗎?這意味着每次用戶加載一個新條目並鎖定它時,我都會打開一個新的事務。或者,最好通過一個「鎖定表」來實現,例如鎖定表中所有鎖定項的鍵?

感謝您的幫助!

回答

1

對數據庫級別進行鎖定是一個好主意嗎?

是的,在某些情況下是好的。

因此,基本上所有當前顯示給用戶的條目都是鎖定在數據庫中的 。
...
還是通過一個「鎖定表」來保存例如表中所有鎖定條目的關鍵字會更好?

因此,你鎖定頁面加載一堆條目?你什麼時候可以釋放它們?如果編輯需要很多時間(例如開始編輯輸入然後去吃午飯)會怎麼樣?如果用戶在沒有編輯所有這些鎖定條目的情況下關閉該頁面,條目將保持鎖定狀態的時間有多長?
悲觀鎖定和「鎖定表」有助於避免一些樂觀鎖定的問題,但帶來新的。

目前我有點解決樂觀鎖定的問題。但是這並不是一個完美的解決方案,因爲一個用戶仍然失去了它的改變。

不能同意,這是,如果驗證和提交階段爲單個原子操作那麼條目將不會被損壞進行,只有一個交易將是成功的鬆動,因爲在你的情況下(讓想這是第一個),另一個會回滾(第二個)。
NHibernate's Optimistic concurrency control

這將是原子的,如果只有這些數據庫事務的一個(最後一個 )把更新的數據,所有其他人簡單地讀取數據。

與高併發性和高可伸縮性一致的唯一方法是使用版本控制的樂觀併發控制。 NHibernate提供了三種可能的方法來編寫 使用樂觀併發的應用程序代碼。

因此,第二個事務將被優雅地回滾,之後用戶可能被通知他要麼進行新的編輯(新的事務),要麼跳過這個條目。

但一切都取決於您的業務邏輯和要求。如果你沒有很高的爭用數據,因此不會有很多衝突,那麼我建議你使用樂觀鎖定。