测试

数据库的初始情况:

  • seata_order.t_order:
    SpringCloudAlibaba--Seata简单案例(三)

  • seata_storage.t_storage: 1号商品总数100,0个售出,实存100.
    SpringCloudAlibaba--Seata简单案例(三)

  • seata_account.t_account: 1号用总金额1000,使用0,余额1000.
    SpringCloudAlibaba--Seata简单案例(三)

正常下单

启动nacos、sentinel、seata以及2001、2002、2003微服务 :
SpringCloudAlibaba--Seata简单案例(三)
访问:localhost:2001/order/create?userId=1&productId=1&count=10&money=100
SpringCloudAlibaba--Seata简单案例(三)
订单表:
SpringCloudAlibaba--Seata简单案例(三)
库存表:
SpringCloudAlibaba--Seata简单案例(三)
账户:
SpringCloudAlibaba--Seata简单案例(三)
正常下单成功。

超时异常,没加@GlobalTransaction

AccountServiceImpl添加超时:
SpringCloudAlibaba--Seata简单案例(三)

再次访问:localhost:2001/order/create?userId=1&productId=1&count=10&money=100
SpringCloudAlibaba--Seata简单案例(三)
报错,因为OpenFeign默认调用时限为1秒。

查看数据库:

订单表:插入了数据,但是因为accountService报错,所以status未修改
SpringCloudAlibaba--Seata简单案例(三)
库存表:出现严重错误,下单失败商品不翼而飞…
SpringCloudAlibaba--Seata简单案例(三)
账户表:出现严重错误,下单失败,但是扣钱了,钱货两空…
SpringCloudAlibaba--Seata简单案例(三)

总结:当库存和账户金额扣减后,订单状态没有设置为已经完成,没有从0改为1,而且由于feign的重试机制,账户余额还有可能被多次扣减。

超时异常,添加@GlobalTransactional

在OrderServiceImpl上添加@GlobalTransactional
SpringCloudAlibaba--Seata简单案例(三)

再次访问:localhost:2001/order/create?userId=1&productId=1&count=10&money=100
SpringCloudAlibaba--Seata简单案例(三)
查看数据库:

订单表:未插入数据
SpringCloudAlibaba--Seata简单案例(三)
库存表:未修改
SpringCloudAlibaba--Seata简单案例(三)
账户表:未修改
SpringCloudAlibaba--Seata简单案例(三)
结论:下单后数据库并没有任何改变,分布式事务控制成功。

相关文章:

  • 2021-10-19
  • 2021-07-07
  • 2021-11-20
  • 2021-11-20
  • 2021-09-18
  • 2022-01-09
  • 2021-11-09
  • 2021-09-16
猜你喜欢
  • 2021-12-13
  • 2021-10-28
  • 2021-10-12
  • 2022-12-23
  • 2022-01-08
  • 2022-01-01
  • 2021-08-18
相关资源
相似解决方案