javaspring嵌套事务和事务传播类型怎么理解-创新互联

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

创新互联公司自2013年创立以来,是专业互联网技术服务公司,拥有项目成都网站制作、网站建设、外贸网站建设网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元泰顺做网站,已为上家服务,为泰顺各地企业和个人服务,联系电话:13518219792

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

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

  多事务嵌套问题解答

  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嵌套事务和事务传播类型怎么理解”有了更深的了解,不妨来实际操作一番吧!这里是创新互联网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!


网站名称:javaspring嵌套事务和事务传播类型怎么理解-创新互联
URL地址:http://pwwzsj.com/article/hsscj.html