2009-01-06 272 views
0

我們希望在我們的WCF/WPF應用程序中實現樂觀鎖定。到目前爲止,我所做的最好的方法是實現一個通用的樂觀存儲器,它將存儲原始和任何更改的副本(因此它將存儲任何值對象的兩個副本:原始和修改),可以是改性。這是做這件事的最好方法嗎?更改跟蹤結構

例如:一個UserVO將被該泛型封裝爲一個Optimistic。當對樂觀進行更改時,將對存儲在樂觀中的修改副本進行更改,同時存儲在樂觀中的原始文件將保持不變。主要問題似乎是它將佔用兩倍的空間和帶寬。

感謝

編輯的解決方案需要獨立於數據庫,這將是能夠指定每個值對象的衝突解決策略是有用的。 (例如,如果更新的行沒有改變,用戶對象可能嘗試合併,但事務對象總是需要用戶干預)。

回答

0

如果您使用SQL Server,則可以使用timestamp列。時間戳列在任何時候修改行時都會更改。基本上,當你更新數據庫時,你可以檢查時間戳列是否與客戶端第一次獲取數據時相同,如果沒有人修改數據。

編輯

如果你想帶寬最小化,你可以通過每個對象上添加一個版本號效仿時間戳的概念。因此,例如:

  1. 客戶端1個請求對象,斷絕返回對象V1
  2. 客戶端2個請求對象,服務器返回Object V2
  3. 客戶端1次修改對象發送回服務器作爲V1
  4. 服務器比較版本和看到的V1 = V1因此它承諾
  5. 服務器遞增對象的版本所以現在它的V2
  6. 客戶端2個modifis對象發送回服務器爲V1
  7. 變化
  8. 服務器版本進行比較,看的V1!= V2所以它執行任何你的政策是

用於配置策略,您可以在配置取決於根的類型,定義一個特定的對象,將處理政策失敗目的。你可以打開一個IOptomisticCheckFailurePolicy接口,你可以在結構圖的時候使用其中的一個DI庫來創建對象(儘管你可以使用反射來輕鬆地加載它)

0

一種實現方式樂觀鎖定邏輯是基於行的最後修改時間戳。因此,更新將如下所示:

UPDATE .... WHERE ID = X和LAST_UPDATED = T

X:記錄ID。 t:從數據庫加載時(即修改之前)行的最後更新時間戳。

請注意,必須直接或間接更新的字段之一是要設置爲現在(或UtcNow)的時間戳。

這樣的更新將失敗的情況下,該記錄在後臺修改。一旦更新失敗,您可以發出進一步的查詢來檢測失敗的原因。例如,

  1. 記錄已被刪除。
  2. 記錄已被修改。

這種簡單的方法提供了行級樂觀鎖定,它不是基於列的並且沒有衝突解決。

+0

如果您使用MS SQL使用時行修改時間戳列其全自動改變時間戳。 – JoshBerke 2009-01-06 00:46:01