@Transactional不生效的场景
- 数据库引擎是否支持事务
- 注解所在的类是否被加载成bean
- 注解所在方法是否为public修饰
- 是否发生了自调用问题
- 所用数据源是否加载了事务管理器
- @Transactional的扩展配置propagation是否正确
- 异常被吃
这个也是出现比较多的场景:
@Service
public class OrderServiceImpl implements OrderService {
@Transactional
public void updateOrder(Order order) {
try {
// update order
} catch {
}
}
}
把异常吃了,然后又不抛出来,事务也不会回滚!
- 异常类型错误
上面的例子再抛出一个异常:
@Service
public class OrderServiceImpl implements OrderService {
@Transactional
public void updateOrder(Order order) {
try {
// update order
} catch {
throw new Exception("更新错误");
}
}
}
这样事务也是不生效的,因为默认回滚的是:RuntimeException,如果你想触发其他异常的回滚,需要在注解上配置一下,如:
@Transactional(rollbackFor = Exception.class)
这个配置仅限于 Throwable 异常类及其子类。