為DbContextScope新增資料庫事務提交完成事件
使用EF開發應用程式的一個難點就在於對其DbContext
的生命週期管理,你的管理策略是否能很好的支援上層服務 使用獨立事務,使用巢狀事務,並行執行,非同步執行等需求? Mehdi El Gueddari對此做了深入研究和優秀的工作並且寫了一篇優秀的文章,為了方便更多的童鞋學習,我已將其翻譯為中文系列 :
在EntityFramework6中管理DbContext的正確方式
當然,在使用Mehdi El Gueddari為我們提供的DbContextScope
元件時,任然會遇到一些比較棘手的問題,比如:
using (var scope = _dbContextScopeFactory.Create())
{
var db = scope.DbContexts.Get<RentalServiceDbContext>();
var bookingInfo = db.BookingInfoes.Load(bookingId);
//呼叫bookingInfo處理一些操作
//當滿足一定的條件,釋出一個事件,事件的訂閱者可以訂閱該資訊並處理
if (bookingInfo.Status == BookingStatus.Ordered)
{
_roomEventSvc.PublishRoomEvent(bookingInfo.RoomId, bookingInfo.Id, RoomEventType.BookingRoom);
}
//提交資料庫事務
scope.SaveChanges();
}
有可能我們釋出的事件會被很快訂閱者處理,甚至在我們提交事務之前!但問題就在於事件的訂閱者很可能假定我們已經提交事務了!
當然,我們很可能想到的最簡單的處理問題的方法就是 將 釋出事件的那個程式碼片段移到 提交 事務後面。確實可以這樣,就這個Demo來說,這樣處理簡單方便。但我們可能面臨更多複雜的場景,比如這個服務方法被巢狀在另外一個服務方法內部呼叫,而且 事務也自動升級為使用外部服務的 事務,那麼這個時候上面的簡單處理方法就失效了!
最好的辦法就是我們能在 DbContextScope
提交事務後,插入一段我們自己的程式碼邏輯來實現我們的業務邏輯功能,很顯然,為DbContextScope
增加一個提交事務事件即可,然後就像下面這樣使用:
using (var scope = _dbContextScopeFactory.Create())
{
var db = scope.DbContexts.Get<RentalServiceDbContext>();
var bookingInfo = db.BookingInfoes.Load(bookingId);
//呼叫bookingInfo處理一些操作
//當滿足一定的條件,釋出一個事件,事件的訂閱者可以訂閱該資訊並處理
if (bookingInfo.Status == BookingStatus.Ordered)
{
//保證我們的PublishRoomEvent方法在事務提交後執行
scope.DbContexts.TransactionCommitted += (sender, args) =>
{
_roomEventSvc.PublishRoomEvent(bookingInfo.RoomId, bookingInfo.Id, RoomEventType.BookingRoom);
};
}
//提交資料庫事務
scope.SaveChanges();
}
其實,只需要幾行程式碼就可以為DbContextScope
增加事務提交事件,在這兒就不具體描述了!
相關文章
- Spring中的事務提交事件Spring事件
- 如何在資料庫事務提交成功後進行非同步操作資料庫非同步
- 為什麼我們需要資料庫事務資料庫
- 資料庫事務與 MySQL 事務總結資料庫MySql
- 資料庫事務概論資料庫
- 資料庫事務的特徵資料庫特徵
- 說說資料庫事務資料庫
- 淺談資料庫事務資料庫
- 資料庫事務以及事務的四個特性資料庫
- MySQL:begin後事務為什麼不提交MySql
- 資料庫事務入門指南資料庫
- Laravel 開啟資料庫事務Laravel資料庫
- MySQL資料庫本地事務原理MySql資料庫
- 資料庫主要物件及事務資料庫物件
- Springboot資料庫事務處理——Spring宣告式事務Spring Boot資料庫
- 資料庫事務與事務的隔離級別資料庫
- 分散式事務之資料庫事務與JDBC事務實現(一)分散式資料庫JDBC
- [20181122]bbed人為修改事務提交標誌.txt
- 【MySQL】資料庫事務深入分析MySql資料庫
- MCMySQL 資料庫 索引和事務ktkMySql資料庫索引
- [專業術語]資料庫事務資料庫
- SRVCTL 刪除和新增資料庫服務資料庫
- 資料庫對比系列之三(PG事務與MySQL事務)資料庫MySql
- Oracle undo 表空間資料檔案丟失強制啟動資料庫(沒有未提交的事務)Oracle資料庫
- 事務單獨提交和
- MySQL事務兩段式提交MySql
- 用【庫存】看懂雲開發資料庫事務資料庫
- 資料庫事務的四大特性資料庫
- 資料庫事務的方方面面資料庫
- MySQL(一):MySQL資料庫事務與鎖MySql資料庫
- MySQL資料庫6:Go與MySQL事務MySql資料庫Go
- 資料庫事務與隔離級別資料庫
- IndexedDB 資料庫新增資料Index資料庫
- SpringBoot事務相關備忘(方法新增@Transactional註解,以及SQL語句(SQLServer資料庫)新增SET NOCOUNT ON)Spring BootSQLServer資料庫
- vitess兩階段提交事務Vite
- 聊聊資料庫的事務隔離級別資料庫
- 一文帶你搞懂資料庫事務資料庫
- 暑期自學 Day 14 | 資料庫 (七)- 事務資料庫