Spring事务嵌套--只回滚子事务

735 阅读1分钟

Spring事务嵌套--只回滚子事务

主子事务均使用普通 @Transactional时 catch子事务异常 会报错

主方法内需循环更新每一条数据,该条数据操作异常则单独回滚该数据

所有数据更新完毕时,一起提交 并清理缓存(避免数据不断改变,但是所有数据更新完毕才刷新缓存,导致查询结果通过缓存取到过时数据)

原设想为 子事务设置回滚.主事务使用@Transactional 大事务catch子事务的异常,继续执行

后了解到 默认@Transactional下,使用catch无法阻止子事务失败影响主事务

默认事务隔离级别:PROPAGATION_REQUIRED

参见以下表格

参考 @Transactional注解的使用禁忌和事务嵌套回滚总结

测试条件结果
B 发生异常,A 未 catchA 回滚,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 回滚

image-20221111143334898

PROPAGATION_NESTED只回滚子事务 且 子事务跟随主事务一起提交

JpaDialect does not support savepoints - check your JPA provider's capabilities

JPA不支持内置事务

Propagation.REQUIRES_NEW只回滚子事务 且子事务单独提前提交

其实该级别即为开启一个新的事务

参考链接

【spring】spring 的事务(transaction) 四 嵌套事务PROPAGATION_NESTED

@Transactional注解的使用禁忌和事务嵌套回滚总结