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,"");
}
那么两者都会回滚,原因是两层都会报错,虽然他们不在同一个事务中;
至于其他的传播行为,应该好理解,已有的事务中进行,没有的事务中进行,不满足条件就抛异常,这很容易理解,不赘述。