From dfa5d5f49ca54cb5d55f5a0d621c054d4fcce4b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A7=E7=81=B0=E7=81=B0?= Date: Mon, 1 Aug 2022 20:15:26 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E4=BC=98=E5=8C=96=E3=80=91=E5=B9=B6?= =?UTF-8?q?=E5=8F=91=E4=B8=8B=E5=8D=95=E5=9C=BA=E6=99=AF=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E9=87=91=E9=A2=9D=E5=8F=98=E5=8A=A8=E5=A2=9E=E5=8A=A0=E4=BA=8B?= =?UTF-8?q?=E5=8A=A1=E9=94=81=E7=9A=84=E6=82=B2=E8=A7=82=E9=94=81=E7=AD=89?= =?UTF-8?q?=E5=BE=85=E6=A8=A1=E5=BC=8F=EF=BC=8C=E9=98=B2=E6=AD=A2=E5=87=BA?= =?UTF-8?q?=E7=8E=B0=E9=87=91=E9=A2=9D=E5=BC=82=E5=B8=B8=E6=83=85=E5=86=B5?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CoreCms.Net.IRepository/IBaseRepository.cs | 12 ++ CoreCms.Net.IServices/IBaseServices.cs | 12 ++ CoreCms.Net.Repository/BaseRepository.cs | 19 +++ CoreCms.Net.Services/BaseServices.cs | 15 +++ .../User/CoreCmsUserBalanceServices.cs | 113 ++++++++++-------- 5 files changed, 120 insertions(+), 51 deletions(-) diff --git a/CoreCms.Net.IRepository/IBaseRepository.cs b/CoreCms.Net.IRepository/IBaseRepository.cs index 7170583d..7b01261c 100644 --- a/CoreCms.Net.IRepository/IBaseRepository.cs +++ b/CoreCms.Net.IRepository/IBaseRepository.cs @@ -229,6 +229,18 @@ namespace CoreCms.Net.IRepository Task QueryByClauseAsync(Expression> predicate, Expression> orderByPredicate, OrderByType orderByType, bool blUseNoLock = false); + + /// + /// 根据条件查询数据(悲观锁等待模式) + /// + /// 条件表达式树 + /// 排序字段 + /// 排序顺序 + /// 是否使用TranLock + /// + Task QueryByClauseWithTranLockAsync(Expression> predicate, + Expression> orderByPredicate, OrderByType orderByType, bool blUseTranLock = false); + /// /// 写入实体数据 /// diff --git a/CoreCms.Net.IServices/IBaseServices.cs b/CoreCms.Net.IServices/IBaseServices.cs index 07489178..0d7e1f45 100644 --- a/CoreCms.Net.IServices/IBaseServices.cs +++ b/CoreCms.Net.IServices/IBaseServices.cs @@ -230,6 +230,18 @@ namespace CoreCms.Net.IServices Task QueryByClauseAsync(Expression> predicate, Expression> orderByPredicate, OrderByType orderByType, bool blUseNoLock = false); + /// + /// 根据条件查询数据(悲观锁等待模式) + /// + /// 条件表达式树 + /// 排序字段 + /// 排序顺序 + /// 是否使用TranLock + /// + Task QueryByClauseWithTranLockAsync(Expression> predicate, + Expression> orderByPredicate, OrderByType orderByType, bool blUseTranLock = false); + + /// /// 写入实体数据 /// diff --git a/CoreCms.Net.Repository/BaseRepository.cs b/CoreCms.Net.Repository/BaseRepository.cs index bd96d025..80ee8913 100644 --- a/CoreCms.Net.Repository/BaseRepository.cs +++ b/CoreCms.Net.Repository/BaseRepository.cs @@ -373,6 +373,25 @@ namespace CoreCms.Net.Repository : await DbBaseClient.Queryable().OrderBy(orderByPredicate, orderByType).FirstAsync(predicate); } + + /// + /// 根据条件查询数据(悲观锁等待模式) + /// + /// 条件表达式树 + /// 排序字段 + /// 排序顺序 + /// 是否使用TranLock + /// + public async Task QueryByClauseWithTranLockAsync(Expression> predicate, + Expression> orderByPredicate, OrderByType orderByType, bool blUseTranLock = false) + { + return blUseTranLock + ? await DbBaseClient.Queryable().TranLock(DbLockType.Wait).OrderBy(orderByPredicate, orderByType) + .FirstAsync(predicate) + : await DbBaseClient.Queryable().OrderBy(orderByPredicate, orderByType).FirstAsync(predicate); + } + + /// /// 写入实体数据 /// diff --git a/CoreCms.Net.Services/BaseServices.cs b/CoreCms.Net.Services/BaseServices.cs index 84c8adc1..6083c809 100644 --- a/CoreCms.Net.Services/BaseServices.cs +++ b/CoreCms.Net.Services/BaseServices.cs @@ -300,6 +300,21 @@ namespace CoreCms.Net.Services return await BaseDal.QueryByClauseAsync(predicate, orderByPredicate, orderByType, blUseNoLock); } + + /// + /// 根据条件查询数据(悲观锁等待模式) + /// + /// 条件表达式树 + /// 排序字段 + /// 排序顺序 + /// 是否使用TranLock + /// + public async Task QueryByClauseWithTranLockAsync(Expression> predicate, + Expression> orderByPredicate, OrderByType orderByType, bool blUseTranLock = false) + { + return await BaseDal.QueryByClauseWithTranLockAsync(predicate, orderByPredicate, orderByType, blUseTranLock); + } + /// /// 写入实体数据 /// diff --git a/CoreCms.Net.Services/User/CoreCmsUserBalanceServices.cs b/CoreCms.Net.Services/User/CoreCmsUserBalanceServices.cs index 07da2b4a..210d007b 100644 --- a/CoreCms.Net.Services/User/CoreCmsUserBalanceServices.cs +++ b/CoreCms.Net.Services/User/CoreCmsUserBalanceServices.cs @@ -64,61 +64,72 @@ namespace CoreCms.Net.Services if (money != 0) { - //取用户实际余额 - var userInfo = await userServices.QueryByIdAsync(userId); - if (userInfo == null) + try { - jm.data = jm.code = 11004; - jm.msg = GlobalErrorCodeVars.Code11004; - return jm; + _unitOfWork.BeginTran(); + + //取用户实际余额 + //(会员陌小北提供) + var userInfo = await userServices.QueryByClauseWithTranLockAsync(p => p.id == userId, p => p.id, OrderByType.Desc, true); + + if (userInfo == null) + { + jm.data = jm.code = 11004; + jm.msg = GlobalErrorCodeVars.Code11004; + return jm; + } + + //取描述,并简单校验 + var res = UserHelper.GetMemo(type, money, cateMoney); + if (string.IsNullOrEmpty(res)) + { + return jm; + } + var memo = res; + if (type != (int)GlobalEnumVars.UserBalanceSourceTypes.Admin) + { + //后台充值或调不改绝对值 + + } + //如果是减余额的操作,还是加余额操作 + if (type is (int)GlobalEnumVars.UserBalanceSourceTypes.Pay or (int)GlobalEnumVars.UserBalanceSourceTypes.Tocash) + { + money = -money - cateMoney; + } + if (type != (int)GlobalEnumVars.UserBalanceSourceTypes.Service) + { + //后台充值或调不改绝对值 + } + + var balance = userInfo.balance + money; + if (balance < 0) + { + jm.data = jm.code = 11007; + jm.msg = GlobalErrorCodeVars.Code11007; + return jm; + } + var balanceModel = new CoreCmsUserBalance(); + balanceModel.userId = userId; + balanceModel.type = type; + balanceModel.money = money; + balanceModel.balance = balance; + balanceModel.sourceId = sourceId; + balanceModel.memo = memo; + balanceModel.createTime = DateTime.Now; + //增加记录 + var balanceModelId = await _dal.InsertAsync(balanceModel); + balanceModel.id = balanceModelId; + //更新用户数据 + await userServices.UpdateAsync(p => new CoreCmsUser() { balance = balance }, p => p.id == userId); + + jm.data = balanceModel; + + _unitOfWork.CommitTran(); } - //取描述,并简单校验 - var res = UserHelper.GetMemo(type, money, cateMoney); - if (string.IsNullOrEmpty(res)) + catch (Exception e) { - return jm; + _unitOfWork.RollbackTran(); } - var memo = res; - if (type != (int)GlobalEnumVars.UserBalanceSourceTypes.Admin) - { - //后台充值或调不改绝对值 - - } - //如果是减余额的操作,还是加余额操作 - if (type == (int)GlobalEnumVars.UserBalanceSourceTypes.Pay || type == (int)GlobalEnumVars.UserBalanceSourceTypes.Tocash) - { - money = -money - cateMoney; - } - if (type != (int)GlobalEnumVars.UserBalanceSourceTypes.Service) - { - //后台充值或调不改绝对值 - - } - - - var balance = userInfo.balance + money; - if (balance < 0) - { - jm.data = jm.code = 11007; - jm.msg = GlobalErrorCodeVars.Code11007; - return jm; - } - var balanceModel = new CoreCmsUserBalance(); - balanceModel.userId = userId; - balanceModel.type = type; - balanceModel.money = money; - balanceModel.balance = balance; - balanceModel.sourceId = sourceId; - balanceModel.memo = memo; - balanceModel.createTime = DateTime.Now; - //增加记录 - var balanceModelId = await _dal.InsertAsync(balanceModel); - balanceModel.id = balanceModelId; - //更新用户数据 - await userServices.UpdateAsync(p => new CoreCmsUser() { balance = balance }, p => p.id == userId); - - jm.data = balanceModel; - } jm.status = true;