1

我明白如何使用實體框架來實現一個工作單元,並且只在整個單元執行完成後才提交更改,但是如何將此更進一步?例如,下面的需求都是一個交易工作單位/應用程序服務方法中的事務?

CreateUser(...) 
{ 
    //1.) New up user object 
    //2.) Add newly created object to database 
    //3.) Send Email 

    //4.) Commit transaction (ensures email is successfully sent AND object is created in database, else transaction fails 
} 

下發生的,我不太清楚如何確保數據庫的一切都發生在一個事務內內發送電子郵件和用戶的節省。任何意見不勝感謝

回答

2

並非所有的資源都是事務性的。電子郵件是其中之一。因此,當交易中其他資源失敗時,不會期望發送電子郵件被回滾。

還有一些替代解決方案:
1)在最後一步調用非事務性資源。
就像您在創建用戶示例中所做的一樣。在這種情況下,所有業務限制都被檢查並通過,失敗的唯一原因是基礎設施問題,這在現實世界中並不經常發生(仔細維護)。在發生基礎設施故障時做出一些補償。這可以自動或手動完成,取決於發生的頻率。例如,如果發送了電子郵件,但用戶設置回滾了,那麼您可以告訴他/她非常抱歉(這非常重要:P),但是設置有問題,請重試。

2)申請最終一致性

使用事務資源,而不是觸發過程。例如,您可以使用消息傳遞(如果使用2階段提交,則全局事務)來通知發送電子郵件。

CreateUser(...) 
{ 
    //1.) New up user object 
    //2.) Add newly created object to database 
    //3.) Publish user setup event by messaging 

    //4.) Commit transaction (ensures message is successfully sent AND object is created in database, else transaction fails 
    } 

在任何情況下,故障和不一致都會或多或少地發生。你需要評估是否可以接受。

相關問題