catch之后不抛出异常_Java学习之——Spring事务异常回滚,捕获异常不抛出就不会回滚...

在电商项目订单系统中,由于忘记给订单明细表的order_id赋值,导致操作3张表时出错。在远程RPC服务中,使用try-catch捕获异常,使得异常未被抛出,因此Spring事务不会回滚。解决方法包括:主动抛出RuntimeException、手动回滚或调整@Transactional注解配置。
摘要由CSDN通过智能技术生成

04794c53d2e78153e6f3af8c92dc8fdd.png

今天写电商项目的时候遇到一个小问题,就是在订单系统ego-order-web项目中,完成用户下订单的操作的时候,忘记给订单明细表中的字段order_id赋值,这时候,完成这个操作的时候,就出现问题了,因为操作的是3张表:

95fb656d2b10ae5aa58ee2ba298e7424.png

订单表:tb_order

ccefbae237aaebd2dc97136027303287.png

订单明细表:tb_order_item

c65785b3d7d861a6e4cb03026b565df4.png

订单配送表:tb_order_shipping

2b6dedf411a72982339889c88c111718.png

出错问题:

97da366eefeabc98a208f9603f8b5fe6.png

远程的rpc服务那边:

eb951f21aa8b9e3e705f08e38c2c5594.png

这里使用了一个try—catch,会对我们发生异常时进行捕获处理,这样一来,当我们在远程调用服务的时候,肯定是不会发生异常的,因为我们已经捕获处理了,并没有往上抛。

这里有一个地方需要理解一下:

b52f0c3bb56cdb2a1eba399738a97261.png

Spring的声明式事务是这样配置的,就是rpc服务的实现类的所有方法都用声明式事务进行管理,我们不能这样理解为这里有异常就回滚了,而应该理解为谁调用它,发生异常才会回滚,也就是说,当我们在远程调用服务的时候,发生了异常才会混滚,所以,我们就得把异常往上抛,不然远程调用服务的时候,是无法得到异常的,这样三个表有一个操作失败的时候,是不会进行混滚的,所以我们需要把异常往上抛一下:

81b80aa4ef04dc268a3daa9db7b4b3aa.png

网上查阅了一下资料,发现大佬们都是这样解决的,而且还有其他方法:

默认spring事务只在发生未被捕获的RuntimeException时才回滚。

解决方式:

1:通过throw new RuntimeException();抛出运行时异常,就是我上面说的这种

2.手动回滚

878b650d06e04010c5e335f481279778.png

3.使用@Transactional注解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值