seata事务模式:AT
账户服务,提供扣减账户余额的接口。只加普通事务(@transactional)
订单服务,提供下单接口,增加seata全局事务(@GlobalTransactional)。代码逻辑如下
- 开启全局事务
- 调用账户服务扣余额
- 休眠3秒钟,模拟服务hang住了
- 生成订单数据
- int i = 1/0;模拟服务异常需要回滚
- 提交事务
操作流程:
- 调用订单服务下单接口(扣减账户余额100元)
- 观察账户服务日志,发现第1步调用账户扣减成功后,再直接调用账户的扣减账户余额接口,扣减200元。因为账户服务只有本地事务,所以能快速成功。
结果:
账户服务用户实际扣了300元。
订单服务显示数据回滚失败,再次请求下单接口,报错:get global lock fail
账户服务一直打印回滚失败的错误日志
麻烦看一下这个问题, 谢谢。
2条答案
按热度按时间ecfdbz9o1#
Changes to the same data should all be managed by Seata.
irlmq6kh2#
Changes to the same data should all be managed by Seata.
It seems to have been said, but it seems not to have been said