为了确保不会出现余额错误,可以使用 EF Core 的事务机制来保证操作的原子性和一致性。具体步骤如下:

  1. 使用 DbContext 开启一个事务
using (var transaction = dbContext.Database.BeginTransaction())
{
    try
    {
        // 事务操作代码
        transaction.Commit();
    }
    catch (Exception ex)
    {
        transaction.Rollback();
    }
}
  1. 在事务中查询用户余额并扣除金额
var user = dbContext.Users.FirstOrDefault(u => u.Id == userId);
if (user != null && user.Balance >= amountToDeduct)
{
    user.Balance -= amountToDeduct;
    dbContext.SaveChanges();
}
else
{
    // 余额不足,抛出异常或返回错误信息
}
  1. 确保两个线程都使用同一个 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 方法,也能确保操作的原子性和一致性,避免余额错误的出现。

EF Core 多线程并发扣除用户余额:事务保证数据一致性

原文地址: https://www.cveoy.top/t/topic/oAqY 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录