Seata对订单/库存/账户微服务的测试
先看看数据原始的状态
- seata_order.t_order:
- seata_storage.t_storage: 1号商品总数100,0个售出,实存100.
- seata_account.t_account: 1号用总金额1000,使用0,余额1000.
正常下单
启动nacos、sentinel、seata以及2001、2002、2003微服务 :
访问:localhost:2001/order/create?userId=1&productId=1&count=10&money=100
订单表状态:
库存表状态:
账户表状态:
正常下单成功。
超时异常,没加@GlobalTransaction
AccountServiceImpl添加超时:
再次访问:localhost:2001/order/create?userId=1&productId=1&count=10&money=100
报错,因为OpenFeign默认调用时限为1秒。上面设置的是20秒,肯定的是报异常的。
但是你查看下面的数据库会发现。
订单表:插入了数据,但是因为accountService报错,所以status未修改
库存表:出现严重错误,下单失败商品不翼而飞…
账户表:出现严重错误,下单失败,但是扣钱了,钱货两空…
**总结:**当库存和账户金额扣减后,订单状态没有设置为已经完成,没有从0改为1,而且由于feign的重试机制,账户余额还有可能被多次扣减。
超时异常,添加@GlobalTransactional
在OrderServiceImpl上添加@GlobalTransactional
表示发生任何异常统统回滚
再次访问:localhost:2001/order/create?userId=1&productId=1&count=10&money=100
查看数据库:
订单表:未插入数据
库存表:未修改
账户表:未修改
结论:下单后数据库并没有任何改变,分布式事务控制成功。