学好分布式架构=3=-分布式事务

这是第五期文章。这一期我们聊聊分布式事务

想要解锁更多新姿势?请访问我的博客

数据库单机事务

要了解分布式事务,首先要明白什么是“事务”。。

可以参考事务的定义:

事务时数据库运行中的一个逻辑工作单元,工作单元内的一系列SQL命令具有原子性操作的特点,这些命令要么完全成功运行,要么完全撤销或者不执行,如果时后者,则表现为数据库内的最终数据没有发生改变。

数据库事务满足4个要求:

  1. 原子性:事务必须时原子工作单元,对其进行数据修改,要么全都执行,要么都不执行
  2. 一致性:事务在完成时,必须使所有数据都保持一致的状态,事务结束时,所有内部数据结构都必须时正确的
  3. 隔离性:由并发事务做出的修改必须和其他并发事务所做的修改隔离
  4. 持久性:事务完成后,对系统的影响时永久的

这其中原子性,需要记录操作过程和对应结果,以便于回退;而隔离性,需要产生锁;这两种要求,导致数据库事务执行代价要远高于非事务性操作

MySQL执行事务

在MySQL里,事务相关的日志为redo和undo两个文件,redo log记录事务修改后的数据,undo log记录事务前的数据

下面时MySQL执行事务的简化流程:

  1. 先记录undo/redo log ,确保日志写入硬盘
  2. 更新数据记录,缓存操作并异步刷新硬盘
  3. commit事务操作。先清理undo信息,然后释放锁资源,在redo中写入commit操作,刷新后确保redo完成并存在硬盘中,这样可以保证数据库的完整性和一致性。

可以看到,很多操作,譬如写日志以防回滚,都是在写commit之前完成的。commit指令在事务中所占时间非常少,这就时事务的一个重要特点。

X/OpenDTP事务模型

分布式事务中,一个事务内的SQL往往操作很多数据库,也要保证事务的4个要求。所以就有X/OpenDTP这个规范了

X/Open DTP 定义了三个角色: AP,TM,RM

  • AP(Application Program):也就是应用程序,可以理解为使用DTP的程序,我们crud的代码就是这个
  • RM(Resource Manager):资源管理器,这里可以理解为一个DBMS系统,或者消息服务器管理系统,应用程序通过资源管理器对资源进行控制。资源必须实现XA定义的接口
  • TM(Transaction Manager):事务管理器,负责协调和管理事务,提供给AP应用程序编程接口以及管理资源管理器

其中,AP 可以和TM 以及 RM 通信,TM 和 RM 互相之间可以通信,DTP模型里面定义了XA接口,TM 和 RM 通过XA接口进行双向通信,例如:TM通知RM提交事务或者回滚事务,RM把提交结果通知给TM。AP和RM之间则通过RM提供的Native API 进行资源控制,这个没有进行约API和规范,各个厂商自己实现自己的资源控制,比如Oracle自己的数据库驱动程序。

img

其中在DTP定了以下几个概念:

事务:一个事务是一个完整的工作单元,由多个独立的计算任务组成,这多个任务在逻辑上是原子的。

全局事务:对于一次性操作多个资源管理器的事务,就是全局事务

分支事务:在全局事务中,某一个资源管理器有自己独立的任务,这些任务的集合作为这个资源管理器的分支任务

控制线程:用来表示一个工作线程,主要是关联AP,TM,RM三者的一个线程,也就是事务上下文环境。简单的说,就是需要标识一个全局事务以及分支事务的关系。

两阶段提交协议

下面说说这个模型中最著名的二阶段提交协议

当一个分布式事务所设计的SQL都执行完成,打了RM最后提交事务的时候,为了避免分布式系统所固有的不可靠性导致提交事务失败,TM这时候会走二阶段提交协议

两阶段提交协议:如果一个事务管理器管理着多个资源管理器,如果控制全局事务和分支事务,在DTP里面说明两阶段提交的协议

第一阶段:发起投票表决

通知所有RM先完成事务提交涉及的复杂准备工作,譬如上文提到的redo日志,尽量把提交过程中所有消耗时间的工作提前完成,确保后面事务100%成功

第二阶段:正式提交

TM将第一阶段的结果进行决策,即提交或取消事务。当且仅当所有参与的RM同意提交时,TM才通知所有RM正式提交事务,否则则取消事务。

下面引用参考文献的一幅图,详细演示了正常情况下的两阶段提交,

img

如果第一阶段某一个资源预提交失败,第二阶段就回滚第一阶段已经预提交成功的资源

img

以上是比较正常的情况,但是由于RM有权利自己根据情况提交或者回滚自己的分支事务(官方说法是:Heuristic Decision)那三么就可能出现以下种情况:

1 在TM通知RM提交事务之前,RM分支事务已经提交

img

2 在TM通知RM提交事务之前,RM分支事务全部回滚

img

3 在TM通知RM提交事务之前,RM分支事务部分回滚

img

互联网中的分布式事务解决方案

下面介绍三种互联网中的分布式事务解决方案

第一种:不用分布式

这个方案时将一个业务流程中需要在一个事务中执行多个相关业务接口包装到一个事务中,从而避免分布式事务。

第二种:eBay方案

第三种: 支付宝DTS框架

参考资料

X/Open DTP(X/Open Distributed Transaction Processing Reference Model)

感谢

结束
此片完了~ 想要了解更多精彩新姿势?
请访问我的个人博客 本篇为原创内容,已在个人博客率先发表,随后CSDN,segmentfault,掘金,简书,开源中国同步发出。如有雷同,缘分呢兄弟。赶快加个好友,咱们两个想个号码, 买个彩票,先挣他个几百万😝

-------------本稿が終わる感谢您的阅读-------------