- xa的两阶段提交协议 分为预提交和正式提交,异常出来了问题,造成数据库的死锁
- 基于弱一致性的事务补偿(任何一个接口提供一个负向接口用于回滚)
- 基于base理论的事务最终一致性
一般来说,分布式事务的实现主要有以下 5 种方案:
XA 方案(两阶段提交)
- 两阶段提交,有一个事务管理器的概念,负责协调多个数据库的事务,
事务管理器先问问各个数据库你准备好了吗?
如果每个数据库都回复 ok,那么就正式提交事务,在各个数据库上执行操作;
如果任何其中一个数据库回答不 ok,那么就回滚事务。
Confirm 阶段:这个阶段说的是在各个服务中执行实际的操作。
Cancel 阶段:如果任何一个服务的业务方法执行出错,那么这里就需要进行补偿,就是执行已经执行成功的业务逻辑的回滚操作。(把那些执行成功的回滚)
可靠消息最终一致性方案(mq)(最终一致性)`
如何基于 RabbitMQ 来实现可靠消息最终一致性方案?
4、Seata模式
事务消息与普通消息的区别就在于消息生产环节,生产者首先预发送一条消息到MQ(这也被称为发送half消息)
MQ接受到消息后,先进行持久化,则存储中会新增一条状态为待发送的消息
然后返回ACK给消息生产者,此时MQ不会触发消息推送事件
生产者预发送消息成功后,执行本地事务
执行本地事务,执行完成后,发送执行结果给MQ
MQ会根据结果删除或者更新消息状态为可发送
如果消息状态更新为可发送,则MQ会push消息给消费者,后面消息的消费和普通消息是一样的
注意点:由于MQ通常都会保证消息能够投递成功,因此,如果业务没有及时返回ACK结果,那么就有可能造成MQ的重复消息投递问题。因此,对于消息最终一致性的方案,消息的消费者必须要对消息的消费支持幂等,不能造成同一条消息的重复消费的情况。