温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java spring嵌套事务和事务传播类型怎么理解

发布时间:2021-12-16 09:39:51 来源:亿速云 阅读:267 作者:iii 栏目:编程语言

本篇内容主要讲解“java spring嵌套事务和事务传播类型怎么理解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java spring嵌套事务和事务传播类型怎么理解”吧!

  一个有事务的方法,去调用另一个有事务的方法,会怎么样?

  一个没有事务的方法,去调用一个有事务的方法,会怎么样?

  多事务嵌套问题解答

  1、在同一个类中,一个无事务方法调用另一个有事务注解方法(比如@Async,@Transational)的方法,注解事务是不会生效的

  2、在同一个类中,一个有事务方法调用另一个有事务注解方法(比如@Async,@Transational)的方法,只有外层事务有效,被调的注解事务是不会生效的

  3、在不同类中,一个无事务方法调用另一个有事务注解方法(比如@Async,@Transational)的方法,有注解事务是生效的

  4、在不同类中,一个有事务方法调用另一个有事务注解方法(比如@Async,@Transational)的方法,两个方法都有事务

  代码示例:

  @Service

  public class PersonServiceImpl implements PersonService {

  @Autowired

  PersonDao personDao;

  @Override

  @Transactional

  public boolean addPerson(Person person) {

  boolean result = personDao.insertPerson(person)>0 ? true : false;

  return result;

  }

  @Override

  @Transactional

  public boolean updatePersonByPhoneNo(Person person) {

  boolean result = personDao.updatePersonByPhoneNo(person)>0 ? true : false;

  addPerson(person); //测试同一个类中@Transactional是否起作用

  return result;

  }

  }

  上述的情况,说白了,就是在一个Service内部,事务方法之间的嵌套调用,不管被调用普通方法和事务方法,都不会开启新的事务!郑州哪家人流医院好 http://www.gz020zj.com/

  spring 在扫描bean的时候会扫描方法上是否包含@Transactional注解,如果包含,spring会为这个bean动态地生成一个类(即代理类,proxy),代理类是继承原来那个bean的。此时,当这个有注解的方法被调用的时候,实际上是由代理类来调用的,代理类在调用之前就会启动transaction。然而,如果这个有注解的方法是被同一个类中的其他方法调用的,那么该方法的调用并没有通过代理类,而是直接通过原来的那个bean,所以就不会启动transaction,我们看到的现象就是@Transactional注解无效。

  总结:spring采用动态代理机制来实现事务控制,动态代理最终都是要调用原始对象的,而原始对象在去调用方法时,是不会再触发代理了!

  重点:自己也可以实现一个事务,原理就是AOP中的动态代理

  解决的嵌套事务方法就简单了(两种):

  把这两个方法分开到不同的类中,把注解加到类名上面;

  Spring事务7种传播属性:

  REQUIRED(require)默认级别:不存在事务则创建一个事务

  REQUIRES_NEW(requires_new):新建一个自己的事务,不论当前是否存在事务,已存在的事务挂起

  NESTED(nested):存在事务则运行在嵌套事务中,不管是调用者还是被调用者不存在则创建一个事务

  SUPPORTS(supports):存在事务则加入,不存在也可以

  NOT_SUPPORT(not_support):以非事务方式运行,如果当前存在事务,则把当前事务挂起

  MANDATORY(mandatory):如果当前存在事务,则运行在当前事务中,如果当前无事务,则抛出异常,也即父级方法必须有事务

  NEVER(never):当前方法不能运行在事务中,存在事务则抛出异常

  代码中实现:

  @Override

  @Transactional(propagation = Propagation.REQUIRED)

  public void addEmpByRequired(String name) {

  Employee employee = new Employee();

  employee.setDeptId(1);

  employee.setName(name);

  employee.setAddress("邯郸");

  employeeMapper.insertSelective(employee);

  departmentService.addDept("jishubu");

  int i = 1/0;

  }

到此,相信大家对“java spring嵌套事务和事务传播类型怎么理解”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI