前言:此隨筆僅供自己學習,如有不足還請指出
在很多業務邏輯場景的時候,需要很多步驟同時進行成功,而且都不能出差錯,而現在我就遇到了這樣的問題,代碼如下
public class BufferCacheRepository : BaseRepository { //依賴注入上下文 private readonly WriteDbContext _writeDbContext; public BufferCacheRepository(WriteDbContext writeDbContext){ _writeDbContext = writeDbContext; } public async Task<bool> Execute(string jobKey) { //新建一個事務 IDbContextTransaction transaction = null; try { //根據業務不同可以省略或拓展 if (ture) { //開啟事務,使用到此上下文的業務都可以包含到事務中 transaction = await _writeDbContext.Database.BeginTransactionAsync(); //這里放你的業務邏輯代碼 // //例子: //下面代碼用到同一個上下文都會包含到事務中並且同時成功或同時失敗,可以根據需求進行封裝 await _writeDbContext.Database.ExecuteSqlCommandAsync("delete from tabulardata"); await _writeDbContext.TabularData.AddRangeAsync(tabularDatas); await _writeDbContext.SaveChangesAsync(); //提交事務 transaction.Commit(); } else { } return true; } catch (Exception ex) { //如果事務不存在或者為控則回滾 transaction?.Rollback(); } finally { //不管怎樣最后都會關閉掉這個事務 using (transaction) { } } return false; } }
這種情況一般會出現在大型數據的匯總、拉取、以及更新。