EF Core 并发控制:如何防止用户余额更新事务冲突?
在 EF Core 中,可以使用数据库事务来锁定记录,让其它线程等待该记录解锁后再继续处理。具体实现如下:
using (var dbContext = new MyDbContext())
{
using (var transaction = await dbContext.Database.BeginTransactionAsync())
{
try
{
// 锁定用户记录
var user = await dbContext.Users.FirstOrDefaultAsync(u => u.Id == userId, cancellationToken: cancellationToken);
await dbContext.Entry(user).ReloadAsync(cancellationToken);
// 检查用户余额是否足够
if (user.Balance < amount)
{
throw new InvalidOperationException('Insufficient balance.');
}
// 更新用户余额
user.Balance -= amount;
dbContext.Users.Update(user);
await dbContext.SaveChangesAsync(cancellationToken);
// 提交事务
await transaction.CommitAsync(cancellationToken);
}
catch (Exception ex)
{
// 回滚事务
await transaction.RollbackAsync(cancellationToken);
throw ex;
}
}
}
在上面的代码中,我们首先使用 dbContext.Entry(user).ReloadAsync() 方法重新加载用户记录,这会在数据库中获取最新的记录,并对其加锁。然后进行余额检查和更新操作,并在最后提交或回滚事务。
需要注意的是,在并发情况下,可能会出现死锁的情况,因此需要谨慎地使用事务和锁定操作。另外,EF Core 也提供了更高级的并发控制方案,如乐观并发控制和悲观并发控制,可以根据具体的业务需求进行选择。
原文地址: https://www.cveoy.top/t/topic/oxFT 著作权归作者所有。请勿转载和采集!