分布式事务

一、介绍

        1、单机事务特点

          事务(一般指数据库的事务)是运行在数据库上的逻辑工作单元,具有 ACID 特点:

           A:Atomic (原则性)        事务必须是原子的工作单元

          C:Consistent (一致性)  事务完成时,所以的数据都保持一致的状态(比如:银行账户操作后,总额不变)

          I:Isolation(隔离性)         并发事务所做的修改之前应该的隔离的

          D:Duration(持久性)       事务完成后,对系统的影响是持久性的

        2、事务操作过程

          1)、记录redo和undo日志文件,确保日志在磁盘上的持久化

          2)、更新数据记录

          3)、提交事务,将redo写入comment记录,并删除undo日志。(执行失败回滚,则按照undo的log文件执行,并所有log文件)


        3、分布式事务:由于业务变更,需要在不同的数据库上也能够保证事务的4大特点。分布式事务的产生一般有两种情况:

          1)、由于数据量需要进行分库分表实现

          2)、由于业务数据量的产生,需要将一个应用中的模块进行拆分(比如电商经常会按照:用户模块,库存模块,订单模块、商品模块等进行服务化改造)。


二、X/OpenDTP事务模型

        1 X/Open Distributed Transaction Processing Reference Model 是由A/Open组织机构提出的一套分布式事务标准,定义了规范的Api接口。 提出了实现模型或协议:

          2PC(two-phase-commit)两阶段提交,用来保证分布式事务的完整性,J2ee遵循了该规范并在在Java中实现了分布式事务的编程接口规范--JTA。

          XA是X/Open DTP 定义的中间件和数据库之间的接口规范,XA接口函数由各个数据库厂商进行提供。

 

        2、模型角色

          1)、AP application 应用本身

          2)、RM resources manager 资源管理器(一般指数据库)

          3)、TM  transaction manager 事务管理器(事务协调)

分布式事务


          3、二阶段提交

             由于分布式情况下存在CAP理论的情况,所以提出二阶段事务提交。

            1)、阶段一、提交事务情况

               1、TM向所有的AP发送事务内容,询问是否可以执行事务的提交操作,并等待各个AP的响应

               2、执行事务    各个AP节点执行事务操作,将redo和undo信息记录到事务日志中,尽量把提交过程中的耗时的操作和准备都提前完成

                       确保后续事务提交的成功率

               3、各个AP向TM反馈事务询问的响应   各个AP将执行成功与否结果返回给TM进行汇集和决策。

            2)、阶段二、执行操作

分布式事务

说明:1、若在阶段一中有参与者返回no的结果,则需要将所有的操作进行回滚,则在阶段二中发送给大家abort的中断请求。

           2、若在阶段一准备了大量的工作,没有发生异常,在阶段二的时候(协调者或者某参与者挂掉,新选举的协调者不知道挂掉的参与者执行的状态)

                  发生状况,虽然发生的概率比准备阶段低很多,但是也存在可能性。


二阶段提交的缺点:

          1、在第二阶段存在数据一致性的问题

          2、同步阻塞(协调者发出指令后需要等待所以的节点返回状态,该阶段是阻塞状态)


         4、3PC(three-phase-commit)数据一致性的问题并没有解决,只是增加成功率

               1)、阶段一:canCommit

               2)、阶段二:preCommit

               3)、阶段三:doCommit


三、分布式事务实现

        1、JOTM(Java open transaction manager)

        2、Atomikos 一般使用第二种方式,下一篇将使用它编写demo实现。