@Transactional 事务注解失效的原因

1. 数据库引擎不支持事务

2. 没有被 Spring 管理

3. 方法不是 public 的

Spring 规定 @Transactional 只能用于 public的方法上,否则事务不会失效。如果要用在非 public 方法上,可以开启 AspectJ 代理模式。

4. 自身调用问题(⭐)

  1. @Service
  2. public class OrderServiceImpl implements OrderService {
  3. public void update(Order order) {
  4. updateOrder(order);
  5. }
  6. @Transactional
  7. public void updateOrder(Order order) {
  8. // update order
  9. }
  10. }

5. 数据源没有配置事务管理器

6. 不支持事务的配置

Propagation.NOT_SUPPORTED:表示不以事务运行,当前若存在事务则挂起。
e.g:

  1. @Service
  2. public class OrderServiceImpl implements OrderService {
  3. @Transactional
  4. public void update(Order order) {
  5. updateOrder(order);
  6. }
  7. @Transactional(propagation = Propagation.NOT_SUPPORTED)
  8. public void updateOrder(Order order) {
  9. // update order
  10. }
  11. }

7. 异常被吃了(⭐)

  1. @Service
  2. public class OrderServiceImpl implements OrderService {
  3. @Transactional
  4. public void updateOrder(Order order) {
  5. try {
  6. // update order
  7. } catch {
  8. }
  9. }
  10. }

8. 异常类型错误(⭐)

  1. @Service
  2. public class OrderServiceImpl implements OrderService {
  3. @Transactional
  4. public void updateOrder(Order order) {
  5. try {
  6. // update order
  7. } catch {
  8. throw new Exception("更新错误");
  9. }
  10. }
  11. }

这样事务也是不生效的,因为默认回滚的是:RuntimeException,如果你想触发其他异常的回滚,需要在注解上配置一下,如:

  1. @Transactional(rollbackFor = Exception.class)