1.首先贴图,事务的几种传播行为总结如图:
2.如果一个service中调用另外一个service层的方法,入口层service上加了@Transactional(默认Propagation.REQUIRED),而调用层saveRole未加事务注解,那么不管哪里报错,两层方法里面数据库都会回滚,亲测如下:
@Transactional(propagation= Propagation.REQUIRED) public void savePerson(){ Person person = new Person(); person.setName("陈灿"); personMapper.insert(person); //保存角色 roleService.saveRole(); Assert.isTrue(1==2,""); }
public void saveRole(){ Role role = new Role(); role.setRoleName("管理员"); roleMapper.insert(role); }role表也会回滚,我想原因是因为它跟personService本身就在同一个事务中;
3.如果roleService方法也开启一个新的事务,如下标红:
@Transactional(propagation = Propagation.REQUIRES_NEW) public void saveRole(){ Role role = new Role(); role.setRoleName("管理员"); roleMapper.insert(role); }
那么person表会回滚,而role表不会回滚,原因是不在同一个事务中;
4.如果把Assert.isTrue(1==2,"")代码拿到roleService层,使下层报错,看代码:
@Transactional(propagation= Propagation.REQUIRED) public void savePerson(){ Person person = new Person(); person.setName("陈灿"); personMapper.insert(person); //保存角色 roleService.saveRole(); }@Transactional(propagation = Propagation.REQUIRES_NEW) public void saveRole(){ Role role = new Role(); role.setRoleName("管理员"); roleMapper.insert(role); Assert.isTrue(1==2,""); }
那么两者都会回滚,原因是两层都会报错,虽然他们不在同一个事务中;
至于其他的传播行为,应该好理解,已有的事务中进行,没有的事务中进行,不满足条件就抛异常,这很容易理解,不赘述。