📌 问题描述
用户并发提交订单时,如何通过数据库事务保证“扣减商品库存、生成订单、记录账户余额变动”的原子性?请说明事务传播行为和隔离级别的选择
✅ 回答要点
为了保证这三个操作的原子性,我会将它们放在同一个数据库事务中执行。在Spring中,使用@Transactional注解,默认的REQUIRED传播行为即可(如果当前没有事务则新建,有则加入)。隔离级别选择READ_COMMITTED,防止脏读的同时保证并发性能;对于库存扣减,我会在SELECT ... FOR UPDATE行锁或乐观锁(版本号)来避免超卖。余额变动同理。若任何一步失败,整个事务回滚。
🔗 相关知识
- 事务ACID - 事务的四个基本特性
- 事务传播行为 - Spring事务传播机制
- 隔离级别 - 数据库隔离级别详解
- 脏读-Dirty-Read - 并发异常:脏读
- 不可重复读-Non-repeatable-Read - 并发异常:不可重复读
- 幻读-Phantom-Read - 并发异常:幻读
- 悲观锁 -
select ... for update行锁机制 - 乐观锁 - 版本号乐观锁实现