A(有DB操作)和B(有DB操作)需要保证分布式事务的一致性。通过引入中间层MQ,A和MQ保持事务的一致性(异常情况下,通过MQ检查A接口实现check),B和MQ保证事务的一致性(通过重试),从而达到最终事务的一致性。
原则:大事务=小事务+异步。
一、MQ与DB的一致性原则(双方事务)流程图7-1。
上面的图表是RocketMQ提供的保证MQDB事务一致性的方案。
MQ消息、DB操作一致性方案
1)向MQ服务器发送消息,此时消息状态为SEND_OK。这个消息是看不见的。
2)执行DB操作;DB执行CommitDB操作成功,DB执行RollbackDB操作失败。
3)如果DB执行成功,回复MQ服务器,状态为COMMIT_MESAGE;如果DB执行失败,回复MQ服务器,将状态改为ROLLBACK_MESAGE。注意这个过程可能会失败。
4)MQ内部提供事务状态服务的服务,该服务检查事务信息的状态,如果发现信息没有COMMIT,则在Producer启动时注册的TransactionCheckListener召回业务系统,业务系统在checkLocalTransactionState方法中检查DB事务状态
描述
以上以DB为例。其实这里可以是任何业务或者数据源。
上述SEND_OK,COMMIT_MESAGE,ROLLBACK_MESAGE均为cli