EF Core 并发更新用户余额:如何避免 `DbUpdateConcurrencyException` 错误?
如果在用户余额更新事务执行过程中,其中用户余额被其他线程修改,会抛出并发异常 'DbUpdateConcurrencyException',通知事务执行失败,需要进行回滚操作。
为了避免并发问题,可以使用 'IsolationLevel.Serializable' 隔离级别来锁定这条记录,让其他线程等待这条记录解锁后再继续处理。代码实现如下:
using (var dbContext = new MyDbContext())
{
using (var transaction = dbContext.Database.BeginTransaction(System.Data.IsolationLevel.Serializable))
{
try
{
var user = dbContext.Users.FirstOrDefault(u => u.Id == 1);
if (user != null)
{
user.Balance -= 100;
dbContext.SaveChanges();
}
transaction.Commit();
}
catch (DbUpdateConcurrencyException ex)
{
transaction.Rollback();
// 处理并发异常
}
}
}
在事务开始前,通过 Database.BeginTransaction 方法传递隔离级别 IsolationLevel.Serializable 来锁定这条记录,其他线程需要等待事务提交或回滚后才能继续处理。如果发生并发异常,则需要进行回滚操作,并进行相应的处理。
原文地址: https://www.cveoy.top/t/topic/oxFV 著作权归作者所有。请勿转载和采集!