今天写电商项目的时候遇到一个小问题,就是在订单系统ego-order-web项目中,完成用户下订单的操作的时候,忘记给订单明细表中的字段order_id赋值,这时候,完成这个操作的时候,就出现问题了,因为操作的是3张表:
订单表:tb_order
订单明细表:tb_order_item
订单配送表:tb_order_shipping
出错问题:
远程的rpc服务那边:
这里使用了一个try—catch,会对我们发生异常时进行捕获处理,这样一来,当我们在远程调用服务的时候,肯定是不会发生异常的,因为我们已经捕获处理了,并没有往上抛。
这里有一个地方需要理解一下:
Spring的声明式事务是这样配置的,就是rpc服务的实现类的所有方法都用声明式事务进行管理,我们不能这样理解为这里有异常就回滚了,而应该理解为谁调用它,发生异常才会回滚,也就是说,当我们在远程调用服务的时候,发生了异常才会混滚,所以,我们就得把异常往上抛,不然远程调用服务的时候,是无法得到异常的,这样三个表有一个操作失败的时候,是不会进行混滚的,所以我们需要把异常往上抛一下:
网上查阅了一下资料,发现大佬们都是这样解决的,而且还有其他方法:
默认spring事务只在发生未被捕获的RuntimeException时才回滚。
解决方式:
1:通过throw new RuntimeException();抛出运行时异常,就是我上面说的这种
2.手动回滚
3.使用@Transactional注解