Spring 事务传播行为解决了什么问题?请说明其作用和使用场景。
考察说明
考查对 Spring 事务传播行为概念和实际作用的理解。
回答思路
- 【回答框架 1】事务传播行为定义:当一个事务方法调用另一个事务方法时,Spring 决定事务如何传播的策略,即当前事务与事务方法之间的交互方式。
- 【回答框架 2】作用:控制事务边界,避免事务嵌套混乱,确保数据一致性和资源管理。例如,在一个服务方法中调用另一个带有事务的方法,传播行为决定是加入现有事务还是新建事务,或非事务执行。
- 【回答框架 3】常见传播行为:REQUIRED(默认,加入当前事务,无则新建)、REQUIRES_NEW(挂起当前事务,新建独立事务)、NESTED(嵌套事务,利用保存点)、SUPPORTS(有事务则加入,无则非事务)、NOT_SUPPORTED(挂起事务,非事务执行)、MANDATORY(必须有事务,否则异常)、NEVER(必须无事务,否则异常)。
- 【回答框架 4】选择原则:根据业务一致性要求选择。默认 REQUIRED 适合大多数场景;REQUIRES_NEW 用于独立子事务,如日志记录,不受外层回滚影响;NESTED 适合部分回滚,但需数据库支持保存点。
- 【回答框架 5】实际应用:例如在一个批量处理主事务中,某个子步骤失败不应影响主流程,可考虑 REQUIRES_NEW 或 NESTED;但要注意 REQUIRES_NEW 会持有数据库连接,注意连接池和事务隔离级别配置。
- 【关键点 1】传播行为定义事务方法间的事务边界交互策略。
- 【关键点 2】REQUIRED 为默认,加入当前事务,无则新建。
- 【关键点 3】REQUIRES_NEW 挂起当前事务,新建独立事务。
- 【关键点 4】NESTED 依赖数据库保存点,支持部分回滚。
- 【关键点 5】选择传播行为需权衡一致性、连接和回滚范围。
- 【易错点 1】REQUIRES_NEW 会挂起外层事务,可能造成锁持有时间过长和连接占用。
- 【易错点 2】自调用(同类内方法调用)不经过代理,传播行为不生效。
- 【易错点 3】NESTED 依赖数据库保存点支持,部分数据库不支持。