image.png

  1. xa的两阶段提交协议 分为预提交和正式提交,异常出来了问题,造成数据库的死锁
  2. 基于弱一致性的事务补偿(任何一个接口提供一个负向接口用于回滚)
  3. 基于base理论的事务最终一致性

一般来说,分布式事务的实现主要有以下 5 种方案:

XA 方案(两阶段提交)

  • 两阶段提交,有一个事务管理器的概念,负责协调多个数据库的事务,

事务管理器先问问各个数据库你准备好了吗?
如果每个数据库都回复 ok,那么就正式提交事务,在各个数据库上执行操作;
如果任何其中一个数据库回答不 ok,那么就回滚事务。

  • 本地消息表(ebay )(消息队列)

    TCC 方案(补偿事务):采用补偿机制

  • Try 阶段:这个阶段说的是对各个服务的资源做检测以及对资源进行锁定或者预留。

Confirm 阶段:这个阶段说的是在各个服务中执行实际的操作。
Cancel 阶段:如果任何一个服务的业务方法执行出错,那么这里就需要进行补偿,就是执行已经执行成功的业务逻辑的回滚操作。(把那些执行成功的回滚)

可靠消息最终一致性方案(mq)(最终一致性)`

如何基于 RabbitMQ 来实现可靠消息最终一致性方案?
4、Seata模式
事务消息与普通消息的区别就在于消息生产环节,生产者首先预发送一条消息到MQ(这也被称为发送half消息)
MQ接受到消息后,先进行持久化,则存储中会新增一条状态为待发送的消息
然后返回ACK给消息生产者,此时MQ不会触发消息推送事件
生产者预发送消息成功后,执行本地事务
执行本地事务,执行完成后,发送执行结果给MQ
MQ会根据结果删除或者更新消息状态为可发送
如果消息状态更新为可发送,则MQ会push消息给消费者,后面消息的消费和普通消息是一样的
注意点:由于MQ通常都会保证消息能够投递成功,因此,如果业务没有及时返回ACK结果,那么就有可能造成MQ的重复消息投递问题。因此,对于消息最终一致性的方案,消息的消费者必须要对消息的消费支持幂等,不能造成同一条消息的重复消费的情况。

  • 最大努力通知方案

    数据库事务的四大特性ACID:

    A:原子性,事务中所有操作要么全部成功,要么全部失败。
    C:一致性,要保证数据库内部完整性约束、声明性约束。
    I:隔离性,对同一资源操作的事务不能同时发生。
    D:持久性,对数据库做的一切修改将永久保存,不管是否出现故障。