2013-08-27 49 views
0

我已經認識到,與領域驅動設計,域對象不會在我的應用程序仍然存在,但而創建和刪除需求。如何在域名申請的版本控制對象

我在想這可能會導致我的應用程序的新情況,我現在必須考慮我正在處理的域對象的版本

在我以前的日子裏,我會更新,即那裏的用戶名,然後,現在我正在獲取並存儲整個用戶作爲一個對象之後,我擔心有覆蓋其他用戶的變化的風險對同一個對象做出的。

什麼是處理這個問題的正確方法是什麼?數據庫中的簡單版本字段?您將如何處理用戶正在嘗試覆蓋的情況?

我寫這篇文章我意識到我可能有類似的問題與我的舊的應用程序,但我有點覺得與域對象打交道時,這是更大的問題...

+1

這聽起來像你的應用程序可能是一個簡單的CRUD界面?在這種情況下,DDD可能根本不適用。否則,你可能想谷歌「事件採購」。 – MattDavey

+0

爲什麼在創建對象並根據需要調整對象時會出現併發問題? – Hippoom

回答

1

有兩個選項時,如何實現更新,請Optimistic vs. Pessimistic locking

你大概說一下樂觀鎖定其實現使用版本號的更新。校長很簡單:你的更新只是希望其他一些線程/用戶不更新相同的(數據庫)行。查詢必須包含匹配(或不匹配)目標數據庫行的版本。

這種方法提高了應用(數據庫)的吞吐量你的第二個可能的選擇 - 悲觀鎖 - 鎖定該行數據庫中,直到事務被提交剛剛停止其他線程/客戶端。

1

由於這個問題被標記用PHP然後我會假設它不是特定於DDD的。該問題還涉及數據庫級別的併發問題。

您可以將版本號列添加到您的數據庫表。與執行你的更新:

UPDATE user 
    SET name = 'Some new name', version = version + 1 
    WHERE id = 24 AND version = 42; 

課程的42來自於任何版本,當你查詢的記錄的用戶了。只有當版本號沒有被其他請求改變時,插入纔會成功。你只需要檢查更新計數,如果計數爲0

這就是所謂的樂觀鎖共同實現拋出異常。

一些PHP奧姆系統,如學說2有這個建於:http://docs.doctrine-project.org/en/latest/reference/transactions-and-concurrency.html

我想再次強調,這是一個數據持久性問題,而不是DDD。我相當懷疑你是否會在域模型級別使用這個版本屬性。