强制回滚spring事务

53 篇文章 0 订阅
46 篇文章 0 订阅
本文探讨了在使用Spring框架进行数据库操作时,如何确保在遇到异常情况时能够正确地回滚事务,避免数据库中产生垃圾数据。特别是针对在一个service方法中先后进行数据库操作和第三方服务调用时,如何通过配置PROPAGATION_REQUIRED和捕获特定异常来实现事务的回滚。
摘要由CSDN通过智能技术生成

本人这两天遇到这样的问题,在一个service方法中先进行了一个数据库操作,之后是一个第三方操作(可能是调用一个第三方的服务)失败,它抛出了一个异常,这时本该将之前数据库所做的操作回滚,但是系统其实还是提交了。后来把第三方操作抛出的异常进行了一个catch,然后再抛出一个继承自RuntimeException的自己定义异常,问题就解决了。晚上同事传来一段文章,看后方始明白,见下文: 我们看看下面的一些配置信息。 PROPAGATION_REQUIRED,-Exception PROPAGATION_REQUIRED,-Exception PROPAGATION_REQUIRED,-Exception PROPAGATION_REQUIRED,-Exception PROPAGATION_REQUIRED,readOnly 这里就是事务处理时如果遇到异常信息,或者其他的原因时我们要求 spring 把当前的事务回滚了,这样才能不至于在数据库中产生垃圾啊。我们规定所有的 save,remove,update,incress 这样的方法开头的在出现一些问题后把事务给回滚了,看看我们写的: PROPAGATION_REQUIRED,-Exception 。 有人就会说 PROPAGATION_REQUIRED 就可以回滚事务啊,为什么加上 ,-Exception 呢?其实我以前也时这样想的,但这是不完全正确的,当然我们在处理一个事务时只要有一个 PROPAGATION_REQUIRED 就可以了,但是当我们的业务逻辑中要求我们在一个事务代理中开启两个事务,这两个事务表面上没有联系,但是实际中又有很多联系的,比如我们上传附件和提交文档,这样两个操作我们可以分开,因为他们不是往一个表里插入数据,我们又不希望这两个操作写在一个 service 里,这样我们要是有一个业务只要上传附件呢?那样我们是不是又要再写一个方法啊!所以在开启两个事务时如果有一个抛出异常了,我们就要把上一个提交的事务回滚了,这样做我们就要用的 -Exception 了,这样就完全满足我们的要求了,我也试过如果我写的是 PROPAGATION_REQUIRED,-SQLException 时,这样我们只会在出现 SQLException 时事务回顾,出现其他的异常事务就不回滚了,好在 spring 可以让我们写如异常的基类就可以做到捕获任何异常,这样我们就写 -Exception 好了。特殊情况在特殊处理吧。通用情况下我们还是这样的。

http://blog.sohu.com/people/f3005917!f/121933508.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值