Spring事务结合try-catch:表A写入操作是否会成功?
问题解答
表A的写入会成功,原因如下:
Spring的@Transactional事务逻辑核心规则是:只有当事务方法抛出未被内部捕获、且符合回滚规则的异常时,才会触发事务回滚。如果异常被方法内部捕获处理且没有重新抛出,事务管理器会判定方法执行正常,最终提交整个事务。
看你给出的代码:
@Transactional fun accept() { try { // 写入表A throw Exception() } catch(e: Exception) { // 写入表B } }
已知表B的写入成功,说明最终事务处于提交状态:
- 你在
try块抛出的Exception被内部catch捕获,没有重新抛出,Spring事务管理器无法感知到异常的发生,因此会提交整个事务。 - 这就导致
try块里的表A写入操作,和catch块里的表B写入操作,都会被持久化到数据库。
唯一的例外情况:如果你的@Transactional注解配置了rollbackFor = Exception.class,那么抛出Exception时事务会被标记为回滚,即使你捕获异常并写入表B,最终整个事务还是会回滚(表B的写入也会失败)——但你明确说明表B写入成功,所以这种配置情况可以直接排除。
内容的提问来源于stack exchange,提问作者Zeeshan Shamsuddeen
相关产品推荐
相关产品推荐

