seata 使用AT的全局事务和本地事务共存时,回滚失败的问题

d8tt03nd  于 22天前  发布在  其他
关注(0)|答案(2)|浏览(14)

seata事务模式:AT

账户服务,提供扣减账户余额的接口。只加普通事务(@transactional)
订单服务,提供下单接口,增加seata全局事务(@GlobalTransactional)。代码逻辑如下

  1. 开启全局事务
  2. 调用账户服务扣余额
  3. 休眠3秒钟,模拟服务hang住了
  4. 生成订单数据
  5. int i = 1/0;模拟服务异常需要回滚
  6. 提交事务

操作流程:

  1. 调用订单服务下单接口(扣减账户余额100元)
  2. 观察账户服务日志,发现第1步调用账户扣减成功后,再直接调用账户的扣减账户余额接口,扣减200元。因为账户服务只有本地事务,所以能快速成功。

结果:
账户服务用户实际扣了300元。
订单服务显示数据回滚失败,再次请求下单接口,报错:get global lock fail
账户服务一直打印回滚失败的错误日志

麻烦看一下这个问题, 谢谢。

ecfdbz9o

ecfdbz9o1#

Changes to the same data should all be managed by Seata.

irlmq6kh

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

相关问题