分布式事务的解决方案

本文最后更新于:2020年1月11日 上午

分布式事务的解决方案

  1. MySQL 自带的两阶段提交/XA

    顾名思义就是要分两步提交事务,多出来的事务为事务管理器。

    大致的流程:

    ​ 第一阶段:事务管理器询问各个资源管理器是否都就绪,所有的参与者需要将自己本身事务是否执行成功的信息反馈给管理者

    ​ 第二阶段: 事务管理者根据资源的反馈,看是否需要提交或者回滚,

    存在的问题:

    1. 一旦事务管理器出问题了,整个系统都不可用了
    2. 数据可能会不一致,因为在阶段二中,需要反馈是否提供,如果反馈(commit)的消息,发送不完整,网络异常了之后,那么接收到会提交,未接收到的,不会提交,这个时候,数据就不一样了
    3. 因为是同步执行的,这时候如果事务未执行完成,其他的事务参与者,只能等待,对于并发来说,存在问题
  2. 可靠异步消息的最终一致性

    借用一个消息中间件,来处理数据的更改,主要核心是异步处理。

    1. A 系统先向 mq 发送一条 prepare 消息,如果 prepare 消息发送失败,则直接取消操作
    2. 如果消息发送成功,则执行本地事务
    3. 如果本地事务执行成功,则想 mq 发送一条 confirm 消息,如果发送失败,则发送回滚消息
    4. B 系统定期消费 mq 中的 confirm 消息,执行本地事务,并发送 ack 消息。如果 B 系统中的本地事务失败,会一直不断重试,如果是业务失败,会向 A 系统发起回滚请求

    该方案的其他应用场景也比较多,比如用户注册成功后发送邮件、电商系统用户下单支付成功给用户发送优惠券等,这些都需要保证最终一致性的场景