Spring 支持哪几种事务管理类型,Spring 的事务实现方式和实现原理是什么?
考察说明
考查对 Spring 事务管理类型、实现方式及底层原理的理解。
回答思路
- 【回答框架 1】Spring 事务管理分为编程式事务和声明式事务两种类型。编程式事务通过 TransactionTemplate 或 PlatformTransactionManager 手动控制事务的提交与回滚;声明式事务基于 AOP,通过 @Transactional 注解或 XML 配置实现,将事务管理与业务代码解耦。
- 【回答框架 2】声明式事务是主流方式,其实现核心是 AOP 代理。Spring 通过 ProxyFactory 为目标对象创建代理,在方法调用前开启事务,方法执行后根据异常情况提交或回滚。代理方式包括 JDK 动态代理(基于接口)和 CGLIB 代理(基于类),Spring Boot 2.x 默认使用 CGLIB。
- 【回答框架 3】事务管理器的抽象是 PlatformTransactionManager,它定义了 getTransaction、commit、rollback 三个方法。具体实现包括 DataSourceTransactionManager(JDBC/MyBatis)、JpaTransactionManager(JPA/Hibernate)、JtaTransactionManager(分布式事务)等。
- 【回答框架 4】实现原理结合了 AOP 和 ThreadLocal:事务信息(如连接、隔离级别、传播行为)绑定到当前线程的 ThreadLocal 中,保证同一线程内多个 DAO 操作共享同一事务连接。@Transactional 通过拦截器(TransactionInterceptor)解析注解属性,并调用事务管理器完成事务控制。
- 【回答框架 5】事务传播行为(如 REQUIRED、REQUIRES_NEW)也由事务管理器在 getTransaction 时处理,决定是新建事务还是加入现有事务。隔离级别和回滚规则也在此阶段生效。理解这些机制有助于排查事务失效问题,如自调用或方法非 public 导致的代理失效。
- 【关键点 1】Spring 事务类型分为编程式事务和声明式事务,声明式基于 AOP 实现。
- 【关键点 2】核心抽象是 PlatformTransactionManager,包含 getTransaction、commit、rollback 方法。
- 【关键点 3】实现原理结合 AOP 代理、ThreadLocal 绑定事务资源和 TransactionInterceptor 拦截。
- 【关键点 4】事务传播行为和隔离级别在 getTransaction 时处理,影响事务的加入或新建。
- 【关键点 5】事务失效常见原因包括自调用、非 public 方法、代理未生效等。
- 【易错点 1】自调用(同类内部方法调用)不会经过代理,导致事务注解失效。
- 【易错点 2】仅将事务注解加在非 public 方法上可能不生效,需确保方法通过代理调用。
- 【易错点 3】事务回滚默认仅针对 RuntimeException 和 Error,检查异常默认不回滚,需配置 rollbackFor。