开发者学堂课程【全面讲解Spring Cloud Alibaba技术栈(知识精讲+项目实战)第五阶段:Seata案例-异常模拟】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/687/detail/11929
Seata案例-异常模拟
内容介绍
一、课时总述
二、异常模拟过程
一、课时总述
已经完成了下订单和扣除库存两方面代码的编写,在最后的测试案例
中会发现如果中间不发生任何的异常,出现对应的请求订单表中可以
写入一条订单,然后在商品库存中是可以对应地减去相应的库存,整
个的业务流程是没有任何问题的。
一旦在这个过程中发生了异常,会出现何种情况,对应的表格中的数
据是否能保持最终的一致性。
下面就通过自主模拟异常的方式来测试一下在下单的过程中一旦发
生异常,表格中的数据会有怎样的变化。
二、异常模拟过程
接下来在商品表中找到对应的扣除库存的地方,在扣除库存的位置直
接模拟一个异常,为了更加安全就添加一个事务的控制。
重新启动 product,等到启动完毕就再次刷新来看一下数据库的状
况。为了观察的更为清晰,在此设置两个断点,第二个断点设置在下
单的业务中。两个微服务均已经调用了,接着对数据库进行刷新。而
后就触发一次新的下单,随后顺着代码执行观察一下断点的状况。之
后就要调用远程的订单服务扣减库存。
现在断点已经位于订单数据库中了,对此刷新一下数据库观察一下状
况。现在发现数据库之中已经写入了一条订单,对应的一份扣库存仍
未进行。
异常一旦发生,后面的操作就无法执行了,这就意味着扣除库存的操
作已经无法完成了。
这样一个分布式事务的问题就被模拟出来了。对应的订单已经下单,
然而对应的库存却未做减法。这就是明显的一个分布式事务问题。把
分布式事务模拟出来后的任务就是如何利用 Seata 解决分布式事务
中的问题。
代码如下
@Override
publicvoidreduceInventory(Integerpid,Integernumber){
productproduct=productDao.findById(pid).get();
if(product.getStock()<number)
thrownewRuntimeException(“库存不足”)
}
inti=1/0
product.setStock(product.getStock()-number)
productDao.save(product)