关于spring 的事务管理

    技术2022-07-11  144

    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,""); }

    那么两者都会回滚,原因是两层都会报错,虽然他们不在同一个事务中;

    至于其他的传播行为,应该好理解,已有的事务中进行,没有的事务中进行,不满足条件就抛异常,这很容易理解,不赘述。

    Processed: 0.011, SQL: 10