标准答案
- REQUIRED 通常加入现有事务,没有则创建;REQUIRES_NEW 暂停外层并创建新事务,失败边界不同。
- 隔离级别控制脏读、不可重复读和幻读等现象,具体效果还取决于数据库实现。
- 默认回滚规则、异常类型、自调用和代理边界会影响事务是否真的开启。
- 事务范围应尽量短,避免把远程调用、用户等待和长批处理放进数据库事务。
题目解析
传播行为描述一个方法如何加入、挂起或创建事务,隔离级别描述并发事务的可见性和冲突行为。一个解决调用边界,一个解决数据库读写边界,不能互相替代。
REQUIRES_NEW 会暂停外层事务并开启独立事务,适合独立审计或补偿记录,但会增加连接和提交边界,外层回滚也不会撤销它。隔离级别还要结合目标数据库实现。
事务范围应短,远程支付、用户等待和长批处理不应随意放在事务里。外部提交与数据库提交顺序不一致时,要用状态机、Outbox 和对账处理结果未知。
常见误区
- 误区:加 @Transactional 就能回滚所有异常。改正:检查代理边界、异常类型、回滚规则和数据源。
- 误区:把 REQUIRES_NEW 当作提高一致性的万能选项。改正:说明独立提交、连接占用和外层失败后的业务语义。
- 误区:事务中调用外部支付却不处理提交结果未知。改正:缩短事务并用幂等、状态查询和对账连接外部副作用。