@Transactional 事务注解失效的原因
1. 数据库引擎不支持事务
2. 没有被 Spring 管理
3. 方法不是 public 的
Spring 规定 @Transactional 只能用于 public的方法上,否则事务不会失效。如果要用在非 public 方法上,可以开启 AspectJ 代理模式。
4. 自身调用问题(⭐)
@Servicepublic class OrderServiceImpl implements OrderService {public void update(Order order) {updateOrder(order);}@Transactionalpublic void updateOrder(Order order) {// update order}}
5. 数据源没有配置事务管理器
6. 不支持事务的配置
Propagation.NOT_SUPPORTED:表示不以事务运行,当前若存在事务则挂起。
e.g:
@Servicepublic class OrderServiceImpl implements OrderService {@Transactionalpublic void update(Order order) {updateOrder(order);}@Transactional(propagation = Propagation.NOT_SUPPORTED)public void updateOrder(Order order) {// update order}}
7. 异常被吃了(⭐)
@Servicepublic class OrderServiceImpl implements OrderService {@Transactionalpublic void updateOrder(Order order) {try {// update order} catch {}}}
8. 异常类型错误(⭐)
@Servicepublic class OrderServiceImpl implements OrderService {@Transactionalpublic void updateOrder(Order order) {try {// update order} catch {throw new Exception("更新错误");}}}
这样事务也是不生效的,因为默认回滚的是:RuntimeException,如果你想触发其他异常的回滚,需要在注解上配置一下,如:
@Transactional(rollbackFor = Exception.class)
