优化接口的并发
This commit is contained in:
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user