多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
## REQUIRED:默认值,有事务就加入,没有就启动一个事务 service1 方法 保存成功,未回滚 service2 方法回滚了 ``` public void add() { SysDept dept = new SysDept(); dept.setDeptName("service1 是否回滚"); testMapper.insert(dept); test2Service.addOrUpdate(); } ``` ``` @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED) public void addOrUpdate() { SysDept dept = new SysDept(); dept.setDeptName("service2 你好"); testMapper.insert(dept); int i = 0; int j = 5/i; } ``` ## NOT_SUPPORTED:不管有没有事务,当前方法都以无事务运行 service1 方法 回滚了 service2 方法 未回滚,数据库保存成功 ``` @Transactional(rollbackFor = Exception.class) public void add() { SysDept dept = new SysDept(); dept.setDeptName("service1 是否回滚"); testMapper.insert(dept); test2Service.addOrUpdate(); } ``` ``` @Transactional(rollbackFor = Exception.class, propagation = Propagation.NOT_SUPPORTED) public void addOrUpdate() { SysDept dept = new SysDept(); dept.setDeptName("service2 你好"); testMapper.insert(dept); int i = 0; int j = 5/i; } ``` ## REQUIRES_NEW:不管是否存在事务都新创建一个事务,之前存在事务则挂起 REQUIRES 和 REQUIRES_NEW 主要区别在于存在兄弟事务时的处理上。 当调用者有事务时: * REQUIRES 就加入主事务,相当于自己没有独立的事务,自己方法的事务使用的是主事务,主事务回滚其代码也回滚 * REQUIRES_NEW 是新启动一个事务,这样自己就有独立的事务,当主事务下有多个独立子事务,则独立子事务之前互不影响 | | | | | --- | --- | --- | | service2 事务 | service3事务 | 结果 | | REQUIRES_NEW 报错 | REQUIRES | 都回滚,因为service3没有自己的事务,使用的是service1的事务 | | REQUIRES_NEW 报错 | REQUIRES_NEW | service3不回滚,其他回滚 | service3 add 保存成功,其他俩个回滚成功,相当于有三个事务, service1 大事务和service2、service3 两个小事务,这俩小事务互相独立,所以service2报错不影响service3事务的运行 ``` @Transactional(rollbackFor = Exception.class) public void add() { SysDept dept = new SysDept(); dept.setDeptName("service1 add"); testMapper.insert(dept); test3Service.add(); test2Service.addOrUpdate(); } ``` ``` // 这里不会回滚, 如果换成 REQUIRES 则回滚 @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW) public void add() { SysDept dept = new SysDept(); dept.setDeptName("service3 add"); testMapper.insert(dept); } ``` ``` @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW) public void addOrUpdate() { SysDept dept = new SysDept(); dept.setDeptName("service2 addOrUpdate"); testMapper.insert(dept); int i = 0; int j = 5/i; } ``` ## NEVER:不能运行在事务方法中,否则会直接报错 Existing transaction found for transaction marked with propagation 'never' ## SUPPORTS:有事务就加入,无事务则以无事务运行