采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
我在消费端重试这有一个疑问。
假如A服务和B服务之间通过该章节完成的分布式事务框架进行通信,A服务投递了某账号扣100元的消息到MQ集群,B服务获得该消息后,在数据库中对该账号扣减了100元,也提交了事务,在返回ack给MQ集群时突然宕机了,MQ集群一直没有收到消费者的确认信号,并且由于宕机导致消费者已经和MQ集群断开连接,消息就会重回队列。之后宕机的B服务恢复了,又再次消费了该消息,又再扣减了100元。这样岂不是多扣了100元?
B服务可以在事务的最后ACK消息,这样ACK异常时,事务可以回滚。
但是这样也有问题呀 ACK完之后,事务提交前,就这么一瞬间宕机了,这样消息没了,但数据库却没扣到100块,不就少扣了吗?
一般来说数据库会开启auto_commit,没有显示回滚的事务超时后会被提交。
那我把宕机的时机再往前一点,发生在扣减完100之后和ACK之前。按您所说的,开启自动提交,没有显示回滚的事务超时会被提交,又会导致这么一种情况: 扣减100成功(开启自动提交,没有显示回滚的事务超时会被提交), 并且消息重回队列(MQ集群一直没有收到消费者的确认信号,并且由于宕机导致消费者已经和MQ集群断开连接), 消费者恢复再次获得消息,再次扣100元, 这不就又扣多100元了吗?
登录后可查看更多问答,登录/注册
消息驱动架构+订单状态机,二次开发,手写分布式事务框架。
1.0k 11
1.0k 8
900 7
3.4k 7
889 6