比方說,例如,我有一個小部件訂購應用程序。它允許客戶從小部件目錄中訂購。明顯的對象選擇可能是'目錄'和'訂單'。 'Catalog'對象將允許我瀏覽,添加和刪除小部件。 '訂單'對象將允許我創建和更新訂單。如何建模應用程序並使多線程需求與封裝協調
它們都是多線程安全的並且在內部處理對象鎖定和數據庫事務。它們被很好地封裝/劃分 - 直到需求出現時,說明從目錄中刪除小部件時,包含該小部件的行項目必須從現有訂單中刪除。
處理這種情況的常見方法是使用觀察者模式。換句話說,當零件被刪除時,從「目錄」中引發事件。調解員然後處理此事件並告訴'訂單'刪除與該小部件的訂單項。
優點:保留封裝,鬆耦合。
缺點:是不是刪除的部分和更新的訂單一個單一的原子操作?這種技術會違反這一點。換句話說,如果在處理事件時發生錯誤,則可以在不更新任何訂單的情況下移除零件。
我贊成利弊。但是,這隻能意味着需要另一個對象 - 一個聚合「目錄」和「訂單」,並使兩個操作都以原子方式執行。問題是每個對象都執行對象鎖定和數據庫事務,我都不知道如何清理地提取 - 也就是說,在技術上新對象應該現在處理這個責任,因爲你不能鎖定對象並且執行兩次事務並且仍然有一個原子操作。
想法?這是我以前從未見過的經典問題嗎?我一直在春天的路上,但我不認爲AOP可以在這裏做任何事情。
謝謝。
我認爲他的問題更多的是關於組件的交叉關注,而不是直接親子關係的數據。例如,如果您有級聯刪除,那麼如果您必須根據刪除子對象執行一些交叉操作,該怎麼辦?需要提出通知。但是,由於這種擔心是交叉的,因此將這些行動納入同一原子操作的一部分並不合適。這引出了他所提到的問題,即這種缺乏原子性會引起潛在的由其他故障引起的數據不一致。 – 2011-04-12 23:33:15