spring事务失效的几种场景

不废话

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

以 MySQL 为例,其 MyISAM 引擎是不支持事务操作的,InnoDB 才是支持事务的引擎,一般要支持事务都会使用 InnoDB。

根据 MySQL 的官方文档:
MySQL 的官方文档
从 MySQL 5.5.5 开始的默认存储引擎是:InnoDB,之前默认的都是:MyISAM,所以这点要值得注意,底层引擎不支持事务再怎么搞都是白搭。

2.没有被spring管理

如下面例子:

// @Service
public class OrderServiceImpl implements OrderService {

    @Transactional
    public void updateOrder(Order order) {
        // update order
    }
    
}

如果此时把 @Service 注解注释掉,这个类就不会被加载成一个 Bean,那这个类就不会被 Spring 管理了,事务自然就失效了。

3.方法不是 public 的

大概意思就是 @Transactional 只能用于 public 的方法上,否则事务不会生效,如果要用在非 public 方法上,可以开启 AspectJ 代理模式。

4.自身调用问题

@Service
public class OrderServiceImpl implements OrderService {

    public void update(Order order) {
        this.updateOrder(order);
    }
    
    @Transactional
    public void updateOrder(Order order) {
        // update order
    }
    
}

发生了自身调用,就调该类自己的方法,而没有经过 Spring 的代理类,默认只有在外部调用事务才会生效,this是一个实际的对象,事务调用者为动态代理对象才生效

5.异常被处理掉了

@Service
public class OrderServiceImpl implements OrderService {

    @Transactional
    public void updateOrder(Order order) {
        try {
            // update order
        } catch {
            
        }
    }
    
}

把异常吃了,然后又不抛出来,事务怎么回滚吧!

6.异常类型错误

 @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 异常类及其子类。

7.@Transactional标记在了非接口实现的方法上

@Resource
private INoWorkingService noWorkingService;

@Test
void noWorkModel1(){
     noWorkingService.noWorkModel1();
}
 @Override
    public void noWorkModel1() {
        noWorkModel1_1();
    }

    @Transactional
    public void noWorkModel1_1(){
        User user = new User();
        user.setName("noWorkModel1_1");
        user.setAge(777);
        userDao.save(user);
        int q = 1/0;
    }

由于业务开发中通常使用接口作为调用对象,如果注解标记在了接口方法调用的方法中,则事务无效

你可能感兴趣的:(spring)