From 356938d6d393cd2b6b704bbf85ec92378b70e537 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A9=99=E5=AD=90?= <454313500@qq.com> Date: Sat, 30 Nov 2024 23:45:19 +0800 Subject: [PATCH] =?UTF-8?q?pref:=20=E4=BC=98=E5=8C=96db=E5=B7=A5=E4=BD=9C?= =?UTF-8?q?=E5=8D=95=E5=85=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UnitOfWorkSqlsugarDbContextProvider.cs | 20 ++++++++----------- .../Services/TestService.cs | 6 ++++-- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/Yi.Abp.Net8/framework/Yi.Framework.SqlSugarCore/Uow/UnitOfWorkSqlsugarDbContextProvider.cs b/Yi.Abp.Net8/framework/Yi.Framework.SqlSugarCore/Uow/UnitOfWorkSqlsugarDbContextProvider.cs index d67b24ee..34a48521 100644 --- a/Yi.Abp.Net8/framework/Yi.Framework.SqlSugarCore/Uow/UnitOfWorkSqlsugarDbContextProvider.cs +++ b/Yi.Abp.Net8/framework/Yi.Framework.SqlSugarCore/Uow/UnitOfWorkSqlsugarDbContextProvider.cs @@ -35,8 +35,7 @@ namespace Yi.Framework.SqlSugarCore.Uow CurrentTenant = currentTenant; Logger = NullLogger>.Instance; } - - //private static object _databaseApiLock = new object(); + public virtual async Task GetDbContextAsync() { @@ -48,19 +47,16 @@ namespace Yi.Framework.SqlSugarCore.Uow var unitOfWork = UnitOfWorkManager.Current; - if (unitOfWork == null /*|| unitOfWork.Options.IsTransactional == false*/) + if (unitOfWork == null ) { - var dbContext = (TDbContext)ServiceProvider.GetRequiredService(); - //提高体验,取消工作单元强制性 - //throw new AbpException("A DbContext can only be created inside a unit of work!"); + //var dbContext = (TDbContext)ServiceProvider.GetRequiredService(); //如果不启用工作单元,创建一个新的db,不开启事务即可 - return dbContext; + //return dbContext; + + //2024-11-30,改回强制性使用工作单元,否则容易造成歧义 + throw new AbpException("DbContext 只能在工作单元内工作,当前DbContext没有工作单元,如需创建新线程并发操作,请手动创建工作单元"); + } - - - - - //尝试当前工作单元获取db var databaseApi = unitOfWork.FindDatabaseApi(dbContextKey); diff --git a/Yi.Abp.Net8/src/Yi.Abp.Application/Services/TestService.cs b/Yi.Abp.Net8/src/Yi.Abp.Application/Services/TestService.cs index cde02589..6c563991 100644 --- a/Yi.Abp.Net8/src/Yi.Abp.Application/Services/TestService.cs +++ b/Yi.Abp.Net8/src/Yi.Abp.Application/Services/TestService.cs @@ -67,7 +67,8 @@ namespace Yi.Abp.Application.Services public async Task GetUowAsync() { //魔改 - // 用户体验优先,万金油模式,支持高并发。支持单、多线程并发安全,支持多线程工作单元,支持多线程无工作单元,支持。。。 + // 用户体验优先,万金油模式,支持高并发。支持单、多线程并发安全,支持多线程工作单元,支持。。。 + // 不支持多线程无工作单元,应由工作单元统一管理(来自abp工作单元设计) // 请注意,如果requiresNew: true只有在没有工作单元内使用,嵌套子工作单元,默认值false即可 // 自动在各个情况处理db客户端最优解之一 int i = 3; @@ -78,7 +79,8 @@ namespace Yi.Abp.Application.Services { 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)) { await sqlSugarRepository.InsertAsync(new BannerAggregateRoot { Name = "插入1" });