直接回答:Spring 定义了七种传播行为,最常用的是 REQUIRED(默认:有事务就加入,没有就新建)和 REQUIRES_NEW(挂起当前事务,独立新建一个)。其余为 SUPPORTS(有就用没有也行)、MANDATORY(必须有否则抛异常)、NOT_SUPPORTED(以非事务执行)、NEVER(不能有事务否则抛异常)、NESTED(在当前事务内嵌套,基于 savepoint 回滚到保存点)。

展开解析:事务失效的常见场景——

  1. 自调用:同类中 this.methodB() 调用带 @Transactional 的方法,绕过了代理对象,事务不生效(这是 AOP 代理的固有限制);
  2. 方法非 public,或被 final/static 修饰(CGLIB 代理无法覆盖);
  3. 异常被 catch 吞掉,事务感知不到异常而正常提交;
  4. 默认只对 RuntimeException/Error 回滚,抛出受检异常却不配置 rollbackFor
  5. 底层存储不支持事务(如 MySQL 的 MyISAM 引擎);
  6. 多线程场景:@Transactional 方法内新开线程,事务绑定在线程上,子线程不受控。

原理:事务通过 AOP 代理实现,TransactionInterceptor 在方法前开启事务,用 DataSourceUtils 把数据库连接绑定到当前线程,提交/回滚后解绑。追问:REQUIRES_NEW 与 NESTED 的区别、事务隔离级别如何配置。