Seata解决分布式事务案例(三)
目录
测试分布式服务调用的事务问题
紧接上篇https://blog.****.net/Delicious_Life/article/details/106987279
我们先来测试在三个微服务都正常的情况下,是否可以基于Feign实现事务的分布式操作
也就是说能否经过一顿操作,实现下单、减库存、更新金额、更改订单状态为已完成
我们先看下三个数据库的初始状态
我们在浏览器输入下面的请求访问
http://localhost:2001/order/create?userId=1&productId=1&count=10&money=100
显示订单创建成功~
此时我们看下三个数据库,全部正常做了修改~
下面我们再测试下当启动的某个服务遇到了问题,事务操作是否能同步执行~
我们在account微服务的service方法中设置延时20s执行 ,使用feign默认情况下延时大于1s即被认为服务出现异常。
此时,再次发起url请求,订单状态更改由于并没有在最后一步执行成功,因此status依然为0。此时订单状态为未完成,未完成account表的金额和storage的库存数却改变了,事务无法保证了~
使用Seata对分布式事务进行管理
只需要在2001微服务的service实现类上添加@GlobalTransactional注解即可,也就是说只需要在要执行事务操作的方法上添加该注解即可。
里面的参数“name”是你自定义的事务名称
但请求执行,首先三个数据库中的数据都没有做更新。前台效果是
控制台效果是
但这个异常被seata接受到了,seata的事务管理器进行回滚操作而非更新操作~
使用Seata处理事务问题只会出现两种情况。要么分布式事务正常执行成功,数据库操作均生效。要么事务执行失败,所有数据库均为变化~