1.分布式事务是什么?

  • 在分布式系统中,事务参与者在不同的分布式节点上事务操作的数据源不是同一个, 这些情况产生的事务都叫做分布式事务。
  • 例如:
    项目 A 实现 Tb_item 表新增、项目 B 实现 tb_item_param 新增,现在需要实现商品新增,需要把项目 A 和项目 B 两个项目新增的方法组成一个事务,这个事务就是分布式事务。
  • 例如:
    项目中向 MySQL 做新增,同时还需要向 Redis 或 MongoDB 执行新增,希望执行 MySQL 或 Redis 或 MongoDB 时如果出现异常进行事务回滚,这种情况也成为分布式事务。

2.什么时候使用分布式事务

  • 事务的概念最早是在学习数据库(MySQL、Oracle)中接触到的,一个事务(本地事务)就是一系列 SQL 语句的集合,只要在执行过程中一条 SQL 出错就会导致整个事务失败,回滚到原点。而在分布式系统中存在多模块完成一次业务。那么就存在一个业务由多模块操作同一个数据源
     
  • 甚至可能存在一个业务横跨多种数据源节点的可能。这些问题都可以由分布式事务解决方案 TX-LCN 解决
     

3.分布式事务常见解决方案

3.1 基于 XA 协议的两阶段提交

  • 分布式事务通常采用 2PC 协议,全称 Two Phase Commitment Protocol。该协议主要为了解决在分布式数据库场景下,所有节点间数据一致性的问题。分布式事务通过 2PC 协议将提交分成两个阶段:
    1、 prepare;
    2、 commit/rollback;
  • 阶段一为准备(prepare)阶段。即所有的参与者准备执行事务并锁住需要的资源。参与者 ready 时,向 transaction manager 报告已准备就绪。
  • 阶段二为提交阶段(commit)。当 transaction manager 确认所有参与者都 ready 后,向所有参与者发送 commit 命令

3.2 消息事务+最终一致性

  • 所谓的消息事务就是基于消息中间件的两阶段提交,本质上是对消息中间件的一种特殊利用,它是将本地事务和发消息放在了一个分布式事务里,保证要么本地操作成功并且对外发消息成功,要么两者都失败
  • 分布式事务,本质上是对多个数据库的事务进行统一控制,按照控制力度可以分为:不控制、部分控制和完全控制。不控制就是不引入分布式事务,部分控制就是各种变种的两阶段提交,包括上面提到的消息事务+最终一致性、TCC 模式,而完全控制就是完全实现两阶段提交。部分控制的好处是并发量和性能很好,缺点是数 据一致性减弱了,完全控制则是牺牲了性能,保障了一致性,具体用哪种方式,最终还是取决于业务场景