spring的事务传播机制 @Transational注解

spring的事务传播机制:多个事务方法相互调用时,事务如何在这些方法中传播。

分为三种:

1.1支持当前事务:

  REQUIRED(必须有):如果当前方法没有事务,新建一个事务,如果已经存在事务,则加入这个事务。

       SUPPORTS(可有可无):支持当前事务,如果当前没有事务,就以非事务方式执行。

  MANDATORY(强制):使用当前事务,如果当前没有事务,就抛出异常。

1.2不支持当前事务

  REQUIRES_NEW:新建事务,如果当前存在事务则当前事务挂起。

   NOT_SUPPORTED: 以非事务的方式运行,如果当前存在事务,则把当前事务挂起。

  NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。

1.3NESTED:如果当前存在事务,则嵌套在事务内执行(会和上层事务一起提交),如果当前不存在事务则,和REQUIRED操作类似。

 

 @Transactional()
    @Override
    public void requiredTest() {
       /* User userupdate=new User();
        userupdate.setId(2);
        userupdate.setName("required");
        userDao.update(userupdate);*/
 // otherService.requiredTest();//有事务加入当前事务没有就自己创建一个新的事务
// otherService.requiredNewTest(); //不加入当前事务,会执行自己的修改
// otherService.sopportsTest();//有事务就会加入到当前事务 回滚
otherService.notSopportsTest();//不加入当前事务 自己执行 里层的异常会影响外层的提交
// otherService.mandatoryTest();//当前的方法必须在事务中运行,否则的话就抛出异常。
// otherService.nestedTest();// 嵌套开启一个新事务 受外层事务影响 外层有异常也不会提交
// otherService.neverTest();//以非事务的方式运行,如果当前存在事务,则抛出异常

int i=10/0;//抛异常

}

 

事务失效的情况:

1.注解应用在非public方法上 

2.propagation配置错误 PROPAGATION_SUPPORTS ;PROPAGATION_NOT_SUPPORTED; PROPAGATION_NEVER  

3.@Transactional 注解属性 rollbackFor 设置错误(默认值捕获runtimexception和error )

4、同一个类中方法调用,导致@Transactional失效  因为事务生效必须要是代理类调用才可以 本类相当于调用的被代理类了。

5、异常被你的 catch“吃了”导致@Transactional失效

6、数据库引擎不支持事务 innodb支持事务 myisam不支持事务

 

posted @ 2022-07-08 14:39  小梅子呀  阅读(763)  评论(0编辑  收藏  举报