2011-04-12 35 views
0

比方說,例如,我有一個小部件訂購應用程序。它允許客戶從小部件目錄中訂購。明顯的對象選擇可能是'目錄'和'訂單'。 'Catalog'對象將允許我瀏覽,添加和刪除小部件。 '訂單'對象將允許我創建和更新訂單。如何建模應用程序並使多線程需求與封裝協調

它們都是多線程安全的並且在內部處理對象鎖定和數據庫事務。它們被很好地封裝/劃分 - 直到需求出現時,說明從目錄中刪除小部件時,包含該小部件的行項目必須從現有訂單中刪除。

處理這種情況的常見方法是使用觀察者模式。換句話說,當零件被刪除時,從「目錄」中引發事件。調解員然後處理此事件並告訴'訂單'刪除與該小部件的訂單項。

優點:保留封裝,鬆耦合。

缺點:是不是刪除的部分和更新的訂單一個單一的原子操作?這種技術會違反這一點。換句話說,如果在處理事件時發生錯誤,則可以在不更新任何訂單的情況下移除零件。

我贊成利弊。但是,這隻能意味着需要另一個對象 - 一個聚合「目錄」和「訂單」,並使兩個操作都以原子方式執行。問題是每個對象都執行對象鎖定和數據庫事務,我都不知道如何清理地提取 - 也就是說,在技術上新對象應該現在處理這個責任,因爲你不能鎖定對象並且執行兩次事務並且仍然有一個原子操作。

想法?這是我以前從未見過的經典問題嗎?我一直在春天的路上,但我不認爲AOP可以在這裏做任何事情。

謝謝。

回答

-1

This是一個鏈接,描述了在GORM下不同類型的關係如何處理/級聯刪除和更新。看起來你所描述的設置可以建模爲幾個1:m或m:n的關係。 Ctrl + F代表「級聯」,這應該闡明如何處理關係之間的變化以及如何對關係進行最佳建模。就錯誤而言,如果您提供正確的「belongsTo」關係,級聯還有助於照顧這些問題。如果您想刪除或更改父對象,則必須先刪除/更新兒童。如果對子項所做的更改失敗,則原始調用將失敗,並且不會將更改持久保存到數據庫。當文檔在更改後引用「保存」時,它指的是永久性更改,在給定一組關係的情況下,只能在特定情況下執行永久性更改,例如子級對象已經首先刪除子對象。對不起,我不能給你一個直接的答案,因爲我不確定你是否試圖改變你的模型風格或實現你自己的關係模型,但希望這可以幫助你一點點。據我所知,GORM應該是線程安全的。轉到最上面並閱讀整個「5.對象關係映射(GORM)」部分。祝你好運!

+0

我認爲他的問題更多的是關於組件的交叉關注,而不是直接親子關係的數據。例如,如果您有級聯刪除,那麼如果您必須根據刪除子對象執行一些交叉操作,該怎麼辦?需要提出通知。但是,由於這種擔心是交叉的,因此將這些行動納入同一原子操作的一部分並不合適。這引出了他所提到的問題,即這種缺乏原子性會引起潛在的由其他故障引起的數據不一致。 – 2011-04-12 23:33:15