EF Core出现DbUpdateException时是否会自动回滚事务?
EF Core DbUpdateException 事务回滚规则说明
- 未手动开启显式事务时:EF Core 调用
SaveChanges()会默认开启隐式事务,一旦抛出DbUpdateException,隐式事务会自动回滚,无需额外手动操作。 - 已手动开启显式事务(调用
BeginTransaction()/BeginTransactionAsync())时:DbUpdateException不会触发自动回滚,必须手动执行回滚操作。
针对你使用 MySQL +
FOR UPDATE的场景补充说明:FOR UPDATE加的行锁是事务级别的,和事务生命周期绑定。如果是在显式事务内执行的加锁查询,后续SaveChanges()报错时,即便你不手动回滚,事务销毁时也会自动释放锁,但还是建议显式调用Rollback(),避免连接复用时出现锁长时间持有的问题。
显式事务场景下的示例代码
using var tran = await context.Database.BeginTransactionAsync(); try { // 执行带FOR UPDATE的查询 var data = await context.TableName.FromSqlRaw("SELECT * FROM table_name FOR UPDATE").ToListAsync(); // 数据修改逻辑 await context.SaveChangesAsync(); await tran.CommitAsync(); } catch (DbUpdateException) { // 必须手动回滚事务 await tran.RollbackAsync(); // 后续异常处理逻辑 }
内容的提问来源于stack exchange,提问作者Thanuja Dilhan
相关产品推荐
相关产品推荐

