為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
- goldengate跳過/提交一個未完成的事務Go
- 資料庫映象和跨資料庫事務資料庫
- 為 Key-Value 資料庫實現MVCC 事務資料庫MVC
- 淺談資料庫事務資料庫
- 說說資料庫事務資料庫
- 資料庫事務的特徵資料庫特徵
- 資料庫事務概論資料庫
- 資料庫事務 ACID資料庫
- 資料庫事務隔離資料庫
- 資料庫事務以及事務的四個特性資料庫
- MySQL:begin後事務為什麼不提交MySql
- 資料庫事務與事務的隔離級別資料庫
- 分散式事務之資料庫事務與JDBC事務實現(一)分散式資料庫JDBC
- Laravel 開啟資料庫事務Laravel資料庫
- 資料庫事務入門指南資料庫
- MySQL資料庫本地事務原理MySql資料庫
- 資料庫主要物件及事務資料庫物件
- 為資料庫新增控制檔案資料庫
- 新增叢集資料庫服務service資料庫
- JDBC、JDBC框架、資料庫事務、資料庫連線池JDBC框架資料庫
- 【MySQL】資料庫事務深入分析MySql資料庫
- [專業術語]資料庫事務資料庫
- 資料庫事務隔離級別資料庫
- SQL基礎-->資料庫事務(TRANSACTION)SQL資料庫
- MySQL事務兩段式提交MySql
- MySQL 事務提交過程MySql
- java 事務提交/回滾Java
- SQL Server 查出未提交事務(長事務)SQLSQLServer
- 資料庫對比系列之三(PG事務與MySQL事務)資料庫MySql
- AlwaysOn 可用性組或資料庫映象不支援跨資料庫事務和分散式事務資料庫分散式
- SRVCTL 刪除和新增資料庫服務資料庫