EF Core 多线程并发扣除用户余额:事务保证数据一致性
为了确保不会出现余额错误,可以使用 EF Core 的事务机制来保证操作的原子性和一致性。具体步骤如下:
- 使用 DbContext 开启一个事务
using (var transaction = dbContext.Database.BeginTransaction())
{
try
{
// 事务操作代码
transaction.Commit();
}
catch (Exception ex)
{
transaction.Rollback();
}
}
- 在事务中查询用户余额并扣除金额
var user = dbContext.Users.FirstOrDefault(u => u.Id == userId);
if (user != null && user.Balance >= amountToDeduct)
{
user.Balance -= amountToDeduct;
dbContext.SaveChanges();
}
else
{
// 余额不足,抛出异常或返回错误信息
}
- 确保两个线程都使用同一个 DbContext 实例,并在操作时使用同一个事务
public class UserService
{
private readonly MyDbContext _dbContext;
public UserService(MyDbContext dbContext)
{
_dbContext = dbContext;
}
public void DeductBalance(int userId, decimal amountToDeduct)
{
using (var transaction = _dbContext.Database.BeginTransaction())
{
try
{
var user = _dbContext.Users.FirstOrDefault(u => u.Id == userId);
if (user != null && user.Balance >= amountToDeduct)
{
user.Balance -= amountToDeduct;
_dbContext.SaveChanges();
}
else
{
// 余额不足,抛出异常或返回错误信息
}
transaction.Commit();
}
catch (Exception ex)
{
transaction.Rollback();
}
}
}
}
这样,即使两个线程同时访问 DeductBalance 方法,也能确保操作的原子性和一致性,避免余额错误的出现。
原文地址: https://www.cveoy.top/t/topic/oAqY 著作权归作者所有。请勿转载和采集!