SpringCloudAlibaba--Seata简单案例(三)

本文通过具体案例,演示了在微服务环境下如何利用Seata实现分布式事务控制,避免因超时异常导致的数据不一致问题。从正常下单流程到超时异常场景,再到引入@GlobalTransactional注解后的事务回滚效果,全面解析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秒。

查看数据库:

订单表:插入了数据,但是因为accountService报错,所以status未修改
在这里插入图片描述
库存表:出现严重错误,下单失败商品不翼而飞…
在这里插入图片描述
账户表:出现严重错误,下单失败,但是扣钱了,钱货两空…
在这里插入图片描述

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

超时异常,添加@GlobalTransactional

在OrderServiceImpl上添加@GlobalTransactional
在这里插入图片描述

再次访问:localhost:2001/order/create?userId=1&productId=1&count=10&money=100
在这里插入图片描述
查看数据库:

订单表:未插入数据
在这里插入图片描述
库存表:未修改
在这里插入图片描述
账户表:未修改
在这里插入图片描述
结论:下单后数据库并没有任何改变,分布式事务控制成功。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值