.net core 大型事务的处理办法
前言:此随笔仅供自己学习,如有不足还请指出
在很多业务逻辑场景的时候,需要很多步骤同时进行成功,而且都不能出差错,而现在我就遇到了这样的问题,代码如下
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; } }
这种情况一般会出现在大型数据的汇总、拉取、以及更新。