Spring事务嵌套--只回滚子事务
主子事务均使用普通 @Transactional时 catch子事务异常 会报错
主方法内需循环更新每一条数据,该条数据操作异常则单独回滚该数据
所有数据更新完毕时,一起提交 并清理缓存(避免数据不断改变,但是所有数据更新完毕才刷新缓存,导致查询结果通过缓存取到过时数据)
原设想为 子事务设置回滚.主事务使用@Transactional 大事务catch子事务的异常,继续执行
后了解到 默认@Transactional下,使用catch无法阻止子事务失败影响主事务
默认事务隔离级别:PROPAGATION_REQUIRED
参见以下表格
参考 @Transactional注解的使用禁忌和事务嵌套回滚总结
| 测试条件 | 结果 |
|---|---|
| B 发生异常,A 未 catch | A 回滚,B 回滚 |
| B 发生异常,A catch 了异常,记录日志,未抛出异常 | A 回滚,B 回滚,但出现了异常(Transaction rolled back because it has been marked as rollback-only) |
| B 发生异常,A catch 了异常,记录日志,抛出异常 | A 回滚,B 回滚 |
| B 执行成功后,A 发生异常 | A 回滚,B 回滚 |
PROPAGATION_NESTED只回滚子事务 且 子事务跟随主事务一起提交
JpaDialect does not support savepoints - check your JPA provider's capabilities
JPA不支持内置事务
Propagation.REQUIRES_NEW只回滚子事务 且子事务单独提前提交
其实该级别即为开启一个新的事务