pref: 优化db工作单元

This commit is contained in:
橙子
2024-11-30 23:45:19 +08:00
parent 1090907178
commit 356938d6d3
2 changed files with 12 additions and 14 deletions

View File

@@ -35,8 +35,7 @@ namespace Yi.Framework.SqlSugarCore.Uow
CurrentTenant = currentTenant; CurrentTenant = currentTenant;
Logger = NullLogger<UnitOfWorkSqlsugarDbContextProvider<TDbContext>>.Instance; Logger = NullLogger<UnitOfWorkSqlsugarDbContextProvider<TDbContext>>.Instance;
} }
//private static object _databaseApiLock = new object();
public virtual async Task<TDbContext> GetDbContextAsync() public virtual async Task<TDbContext> GetDbContextAsync()
{ {
@@ -48,19 +47,16 @@ namespace Yi.Framework.SqlSugarCore.Uow
var unitOfWork = UnitOfWorkManager.Current; var unitOfWork = UnitOfWorkManager.Current;
if (unitOfWork == null /*|| unitOfWork.Options.IsTransactional == false*/) if (unitOfWork == null )
{ {
var dbContext = (TDbContext)ServiceProvider.GetRequiredService<ISqlSugarDbContext>(); //var dbContext = (TDbContext)ServiceProvider.GetRequiredService<ISqlSugarDbContext>();
//提高体验,取消工作单元强制性
//throw new AbpException("A DbContext can only be created inside a unit of work!");
//如果不启用工作单元创建一个新的db不开启事务即可 //如果不启用工作单元创建一个新的db不开启事务即可
return dbContext; //return dbContext;
//2024-11-30改回强制性使用工作单元否则容易造成歧义
throw new AbpException("DbContext 只能在工作单元内工作当前DbContext没有工作单元如需创建新线程并发操作请手动创建工作单元");
} }
//尝试当前工作单元获取db //尝试当前工作单元获取db
var databaseApi = unitOfWork.FindDatabaseApi(dbContextKey); var databaseApi = unitOfWork.FindDatabaseApi(dbContextKey);

View File

@@ -67,7 +67,8 @@ namespace Yi.Abp.Application.Services
public async Task GetUowAsync() public async Task GetUowAsync()
{ {
//魔改 //魔改
// 用户体验优先,万金油模式,支持高并发。支持单、多线程并发安全,支持多线程工作单元,支持多线程无工作单元,支持。。。 // 用户体验优先,万金油模式,支持高并发。支持单、多线程并发安全,支持多线程工作单元,支持。。。
// 不支持多线程无工作单元应由工作单元统一管理来自abp工作单元设计
// 请注意如果requiresNew: true只有在没有工作单元内使用嵌套子工作单元默认值false即可 // 请注意如果requiresNew: true只有在没有工作单元内使用嵌套子工作单元默认值false即可
// 自动在各个情况处理db客户端最优解之一 // 自动在各个情况处理db客户端最优解之一
int i = 3; int i = 3;
@@ -78,7 +79,8 @@ namespace Yi.Abp.Application.Services
{ {
tasks.Add(Task.Run(async () => tasks.Add(Task.Run(async () =>
{ {
await sqlSugarRepository.InsertAsync(new BannerAggregateRoot { Name = "插入2" }); //以下操作是错误的不允许在新线程中直接操作db所有db操作应放在工作单元内应由工作单元统一管理-来自abp工作单元设计
//await sqlSugarRepository.InsertAsync(new BannerAggregateRoot { Name = "插入2" });
using (var uow = UnitOfWorkManager.Begin(requiresNew: true, isTransactional: true)) using (var uow = UnitOfWorkManager.Begin(requiresNew: true, isTransactional: true))
{ {
await sqlSugarRepository.InsertAsync(new BannerAggregateRoot { Name = "插入1" }); await sqlSugarRepository.InsertAsync(new BannerAggregateRoot { Name = "插入1" });