Spring事务作用
在数据层或业务层保障一系列的数据库操作同成功同失败。
@Transactional是什么
@Transactional是 Spring 提供的声明式事务注解,本质上通过 AOP 代理 + 事务管理器,在业务方法执行前开启事务,执行成功后提交,发生符合回滚规则的异常时回滚。
事务失效
|-------------|-----------------------------------|-----------------------------------------------------|
| 失效场景 | 原因 | 解决方案 |
| 方法不是 public | Spring AOP 代理默认只对 public 方法生效。 | 确保事务方法是 public 的。 |
| 同类中的自调用 | 通过 this 调用绕过了代理对象。 | 将事务方法移至另一个 Bean 中;或通过 AopContext.currentProxy() 调用。 |
| 异常被"吞掉" | 方法内 catch 了异常但没有抛出,事务管理器认为执行成功。 | 在 catch 块中重新抛出异常,或手动回滚。 |
| 异常类型不匹配 | 默认只对 RuntimeException 和 Error 回滚。 | 使用 rollbackFor = Exception.class 明确指定。 |
| 数据库不支持事务 | 如使用 MyISAM 引擎的 MySQL 表。 | 使用支持事务的存储引擎(如 InnoDB)。 |
同类内部调用
@Service
public class OrderService {
public void test() {
createOrder(); // this.createOrder(),调用原始对象,不走代理,事务失效
}
@Transactional
public void createOrder(){}
}
解决:从 IOC 容器拿代理对象调用;拆分到不同类。
事务相关配置

事务传播行为
