优化接口的并发

This commit is contained in:
tongfei
2024-04-20 11:48:58 +08:00
parent 57acf1b699
commit 4f668a209b

View File

@@ -119,18 +119,39 @@ namespace WMS.Web.Domain.Services
/// <returns></returns> /// <returns></returns>
public async Task<Result> Receive(UpdateInStockTaskRequest dto, LoginInDto loginInfo) public async Task<Result> Receive(UpdateInStockTaskRequest dto, LoginInDto loginInfo)
{ {
IDbContextTransaction _transaction = _basicsRepositories.GetTransaction(); // 构建 Redis 锁的键名
bool isRollback = false; string lockKey = $"lock:taskidreceive{dto.Id}";
bool isTransaction = false; // 构建 Redis 锁的值,用于标识锁的持有者
var result = await this.Receive(dto, loginInfo.UserInfo.StaffId, isTransaction); string lockValue = Guid.NewGuid().ToString();
if (!result.IsSuccess) isRollback = true; // 获取 Redis 锁,设置超时时间为 10 秒
if (await _redisDb.LockTakeAsync(lockKey, lockValue, TimeSpan.FromSeconds(10)))
{
try
{
IDbContextTransaction _transaction = _basicsRepositories.GetTransaction();
bool isRollback = false;
bool isTransaction = false;
var result = await this.Receive(dto, loginInfo.UserInfo.StaffId, isTransaction);
if (!result.IsSuccess) isRollback = true;
//提交事务 //提交事务
var isSuccess = _basicsRepositories.CommitTransaction(isRollback, _transaction); var isSuccess = _basicsRepositories.CommitTransaction(isRollback, _transaction);
if (!isSuccess) if (!isSuccess)
return result; return result;
return Result.ReSuccess();
}
finally
{
// 释放 Redis 锁
await _redisDb.LockReleaseAsync(lockKey, lockValue);
}
}
else
{
return Result.ReFailure(ResultCodes.Concurrent_Instock);
}
return Result.ReSuccess();
} }
/// <summary> /// <summary>
@@ -144,7 +165,7 @@ namespace WMS.Web.Domain.Services
var taskId = instock.Details.Select(x => x.TaskId).FirstOrDefault(); var taskId = instock.Details.Select(x => x.TaskId).FirstOrDefault();
// 构建 Redis 锁的键名 // 构建 Redis 锁的键名
string lockKey = $"lock:taskid{taskId}"; string lockKey = $"lock:taskidshelf{taskId}";
// 构建 Redis 锁的值,用于标识锁的持有者 // 构建 Redis 锁的值,用于标识锁的持有者
string lockValue = Guid.NewGuid().ToString(); string lockValue = Guid.NewGuid().ToString();
// 获取 Redis 锁,设置超时时间为 10 秒 // 获取 Redis 锁,设置超时时间为 10 秒
@@ -198,18 +219,38 @@ namespace WMS.Web.Domain.Services
/// <returns></returns> /// <returns></returns>
public async Task<Result> ShelfNoPurchase(NoPurchaseShelfRequest dto, LoginInDto loginInDto) public async Task<Result> ShelfNoPurchase(NoPurchaseShelfRequest dto, LoginInDto loginInDto)
{ {
_logger.LogInformation($"非采购入库:{JsonConvert.SerializeObject(dto)} 操作人:{loginInDto.UserInfo.StaffId + loginInDto.UserInfo.Nickname}"); // 构建 Redis 锁的键名
IDbContextTransaction _transaction = _basicsRepositories.GetTransaction(); string lockKey = $"lock:taskidshelfnopurchase{dto.TaskId}";
bool isRollback = false; // 构建 Redis 锁的值,用于标识锁的持有者
bool isTransaction = false; string lockValue = Guid.NewGuid().ToString();
//保存非采购上架的数据 // 获取 Redis 锁,设置超时时间为 10 秒
var shelfSave_result = await this.ShelfNoPurchaseSave(dto, loginInDto, isTransaction); if (await _redisDb.LockTakeAsync(lockKey, lockValue, TimeSpan.FromSeconds(10)))
if (!shelfSave_result.IsSuccess) isRollback = true; {
//提交事务 try
var isSuccess = _basicsRepositories.CommitTransaction(isRollback, _transaction); {
if (!isSuccess) _logger.LogInformation($"非采购入库:{JsonConvert.SerializeObject(dto)} 操作人:{loginInDto.UserInfo.StaffId + loginInDto.UserInfo.Nickname}");
return shelfSave_result; IDbContextTransaction _transaction = _basicsRepositories.GetTransaction();
return Result.ReSuccess(); bool isRollback = false;
bool isTransaction = false;
//保存非采购上架的数据
var shelfSave_result = await this.ShelfNoPurchaseSave(dto, loginInDto, isTransaction);
if (!shelfSave_result.IsSuccess) isRollback = true;
//提交事务
var isSuccess = _basicsRepositories.CommitTransaction(isRollback, _transaction);
if (!isSuccess)
return shelfSave_result;
return Result.ReSuccess();
}
finally
{
// 释放 Redis 锁
await _redisDb.LockReleaseAsync(lockKey, lockValue);
}
}
else
{
return Result.ReFailure(ResultCodes.Concurrent_Instock);
}
} }
/// <summary> /// <summary>