请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

对于分布式事务的疑问?

我们基于RabbitMQ开发分布式事务框架,确实保证了消息100%投递和消费端重试。

我在消费端重试这有一个疑问。

假如A服务和B服务之间通过该章节完成的分布式事务框架进行通信,A服务投递了某账号扣100元的消息到MQ集群,B服务获得该消息后,在数据库中对该账号扣减了100元,也提交了事务,在返回ack给MQ集群时突然宕机了,MQ集群一直没有收到消费者的确认信号,并且由于宕机导致消费者已经和MQ集群断开连接,消息就会重回队列。之后宕机的B服务恢复了,又再次消费了该消息,又再扣减了100元。这样岂不是多扣了100元?


正在回答 回答被采纳积分+3

1回答

Moody 2021-05-11 09:31:47

B服务可以在事务的最后ACK消息,这样ACK异常时,事务可以回滚。

0 回复 有任何疑惑可以回复我~
  • 提问者 慕沐3053333 #1
    但是这样也有问题呀
    ACK完之后,事务提交前,就这么一瞬间宕机了,这样消息没了,但数据库却没扣到100块,不就少扣了吗?
    回复 有任何疑惑可以回复我~ 2021-05-13 21:34:00
  • Moody 回复 提问者 慕沐3053333 #2
    一般来说数据库会开启auto_commit,没有显示回滚的事务超时后会被提交。
    回复 有任何疑惑可以回复我~ 2021-05-13 22:00:45
  • 提问者 慕沐3053333 回复 Moody #3
    那我把宕机的时机再往前一点,发生在扣减完100之后和ACK之前。按您所说的,开启自动提交,没有显示回滚的事务超时会被提交,又会导致这么一种情况:
    扣减100成功(开启自动提交,没有显示回滚的事务超时会被提交),
    并且消息重回队列(MQ集群一直没有收到消费者的确认信号,并且由于宕机导致消费者已经和MQ集群断开连接),
    消费者恢复再次获得消息,再次扣100元,
    这不就又扣多100元了吗?
    回复 有任何疑惑可以回复我~ 2021-05-14 12:36:40
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信