Entity framework 在EF Core中处理DbUpdateConcurrencyException
我使用的是EF Core 2.2.4。所有SQL表都有Entity framework 在EF Core中处理DbUpdateConcurrencyException,entity-framework,.net-core,ef-core-2.0,ef-core-2.1,ef-core-2.2,Entity Framework,.net Core,Ef Core 2.0,Ef Core 2.1,Ef Core 2.2,我使用的是EF Core 2.2.4。所有SQL表都有timestamp列。我有下面的方法,尝试为给定用户获取下一个工作订单。如果有多个用户同时竞争,我们可能会得到DbUpdateConcurrencyException,我使用重试逻辑处理它 注意,DBCntext作为作用域实例注入到服务的构造函数中 public async Task<WorkOrder> GetNextOrder(int userID) { var maxTry = 3;
timestamp
列。我有下面的方法,尝试为给定用户获取下一个工作订单。如果有多个用户同时竞争,我们可能会得到DbUpdateConcurrencyException,我使用重试逻辑处理它
注意,DBCntext作为作用域
实例注入到服务的构造函数中
public async Task<WorkOrder> GetNextOrder(int userID)
{
var maxTry = 3;
WorkOrder order = null;
for (int i = 0; i < maxTry; i++)
{
order = await _dbContext.WorkOrder
.Where(o => o.UserID == null)
.OrderBy(o => o.CreatedDateTime)
.FirstOrDefaultAsync();
if (order == null)
{
break; //exit out of the loop
}
order.StatusID = (int)Statuses.InProgress;
order.UserID = userID;
order.AssignedDateTime = DateTime.UtcNow;
try
{
await _dbContext.SaveChangesAsync();
i = maxTry;
}
catch (DbUpdateConcurrencyException ex)
{
// since mutiple users are compting for orders. We may get concurrency issue
// in such case retry to get next order
await _dbContext.Entry(order).ReloadAsync();
order = null;
}
}
return order;
}
有没有办法在不将整个记录集加载到内存的情况下选择随机记录?请看。请看。
public async Task<WorkOrder> GetNextOrder(int userID)
{
var maxTry = 3;
WorkOrder order = null;
using (var transaction = await _dbContext.Database.BeginTransactionAsync())
{
for (int i = 0; i < maxTry; i++)
{
order = await _dbContext.WorkOrder
.Where(o => o.UserID == null)
.OrderBy(o => o.CreatedDateTime)
.FirstOrDefaultAsync();
if (order == null)
{
break; //exit out of the loop
}
order.StatusID = (int)Statuses.InProgress;
order.UserID = userID;
order.AssignedDateTime = DateTime.UtcNow;
try
{
await _dbContext.SaveChangesAsync();
i = maxTry;
}
catch (DbUpdateConcurrencyException ex)
{
// since mutiple users are compting for orders. We may get concurrency issue
// in such case retry to get next order
await _dbContext.Entry(order).ReloadAsync();
order = null;
}
}
transaction.Commit();
}
return order;
}
order = await _dbContext.WorkOrder
.Where(o => o.UserID == null)
.OrderBy(o => o.CreatedDateTime)
.TakeRandonRecord() ??