我有一個服務,讓我們稱之為它MyService.cs存在于我的應用程式的業務層中。我的應用程式有 3 層,業務層、持久層和 API(常規清潔架構)。一個方法MyService需要通過兩個步驟與存盤庫進行互動。所以首先它從客戶端獲取一些輸入,將其發送到存盤庫并將其保存到表 1。然后它獲取新更新的資料,執行一些邏輯,然后將該資料發送到存盤庫以保存在表 2 中。現在我想以原子方式執行此操作。也就是說,如果任一資料庫保存失敗,則進行回滾。但是我無法從服務層訪問 db 背景關系,因此我無法在那里創建事務。我怎樣才能確保這兩個程序在沒有訪問事務的情況下要么失敗要么成功?參見下圖中的流程。

uj5u.com熱心網友回復:
我相信你會想要類似Unit Of Work 模式的東西。這個想法是在對兩個存盤庫進行更改之前您不會保存,因此它們是作為一個事務的一部分進行的。
uj5u.com熱心網友回復:
無法從服務層訪問 db 背景關系,因此我無法在那里創建事務。
嗯,你真的應該。服務層應該負責指定資料形狀(查詢)和編排事務。查詢和資料形狀由服務層的要求驅動,您不應該修改存盤庫層來實作對服務層的更改。做到這一點的唯一方法是讓您的存盤庫層不知道服務的特定要求。同樣,不同的資料庫讀取和寫入何時以及是否屬于單個事務的一部分也不是您的存盤庫可以或應該知道的。
只需將 DbContext 注入服務層,您就可以編排事務。在同一 DI 范圍內執行的其他層將決議相同的DbContext 實體。如果您認為它更簡潔,您可以將 DbContext 包裝在自定義的 UnitOfWork 包裝器中。
另一種選擇是在您的服務層中使用TransactionScope并依靠它來將環境事務傳遞到您的其他層。您可能需要指定TransactionScopeAsyncFlowOption以使事務流。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/383960.html
