两段式提交
(2 Phase Commit,2PC)
准备阶段
重操作
提交阶段
轻操作
三段式提交
(3 Phase Commit,3PC)
在事务需要回滚的场景中:三段式的性能通常是要比两段式好很多的。
但在事务能够正常提交的场景中:两者的性能都依然很差,甚至三段式因为多了一次询问,还要稍微更差一些。
CanCommit
轻操作
PreCommit
重操作
CanCommit
轻操作
TCC事务
业务侵入性强
加入业务的中间字段
Try
confirm
冥等
cancel
AT事务
反向sql
MQ消息最终一致性解决方案
事务消息
由于传统的处理方式无法解决消息生成者本地事务处理成功
与消息发送成功
两者的一致性问题,因此事务消息就诞生了,它实现了消息生成者本地事务与消息发送的原子性,保证了消息生成者本地事务处理成功与消息发送成功的最终一致性
问题。
https://www.jianshu.com/p/eb571e4065ec
RocketMQ支持事务消息
- 生产者先发消息,再执行业务操作: 如果反过来,可能业务执行成功就宕机,消息没发出,导致不一致
- 事务消息是针对生产端而言的,而消费端,消费端的一致性是通过MQ的重试机制来完成的:消息消费失败的话,MQ自己会负责重推消息,直到消费成功(消费者保证幂等性)。
RocketMQ事务消息原理
MQ存储了待发送
的消息,但是MQ无法感知到上游处理的最终结果。对于RocketMQ而言,它的解决方案非常的简单,就是其内部实现会有一个定时任务,去轮训状态为待发送
的消息,然后给producer发送check请求,而producer必须实现一个check监听器,监听器的内容通常就是去检查与之对应的本地事务是否成功(一般就是查询DB),如果成功了,则MQ会将消息设置为可发送
,否则就删除消息。