·XA 规范 是 X/Open 组织定义的分布式事务处理(DTP,Distributed Transaction Processing)标准。
·XA 规范 使用两阶段提交(2PC,Two-Phase Commit)协议来保证所有资源同时提交或回滚任何特定的事务。
角色说明:
·AP 应用程序,也就是业务层。哪些操作属于一个事务,AP来定义。
·RM 资源管理器。一般是数据库,也可以是消息队列,文件系统等。
·TM 事务管理器,接收AP的事务请求,对全局事务进行管理,管理事务的状态,协调RM的处理,通知RM哪些操作属于哪些全局事务以及事务分支等等。
AP自己操作TM,当需要事务时,AP向TM请求发起事务,TM负责整个事务的提交,回滚
2pc解决的是分布式数据强一致性问题
优点:
实现原理简单。
缺点:
2PC的提交在执行过程中,所有参与事务操作的逻辑都处于阻塞状态,也就是说,各个参与者都在等待其他参与者响应,无法进行其他操作;
数据不一致。当执行事务提交过程中,如果协调者向所有参与者发送Commit请求后,发生局部网络异常或者协调者在尚未发送完Commit请求,即出现崩溃,最终导致只有部分参与者收到、执行请求。于是整个系统将会出现数据不一致的情形;
事务协调者是整个XA模型的核心,一旦事务协调者节点挂掉,会导致参与者收不到提交或回滚的通知,从而导致参与者节点始终处于事务无法完成的中间状态。
3PC
作为2PC的改进版,3PC将原有的两阶段过程,重新划分为CanCommit、PreCommit和do Commit三个阶段,引入超时机制。
在doCommit阶段,如果参与者无法及时接收到来自协调者的doCommit或者abort请求时,会在等待超时之后,继续进行事务的提交。(其实这个应该是基于概率来决定的,当进入第三阶段时,说明参与者在第二阶段已经收到了PreCommit请求,那么协调者产生PreCommit请求的前提条件是他在第二阶段开始之前,收到所有参与者的CanCommit响应都是Yes。(一旦参与者收到了PreCommit,意味他知道大家其实都同意修改了)所以,一句话概括就是,当进入第三阶段时, 由于网络超时等原因,虽然参与者没有收到commit或者abort响应,但是他有理由相信:成功提交的几率很大。 )
2PC和3PC的区别:
3PC在协调者和参与者中都引入超时机制。2PC只有协调者才有超时机制。
好处:
避免了参与者在长时间无法与协调者节点通讯(协调者挂断)的情况下,无法释放资源。
缺点:
没有解决数据不一致问题。假如在doCommit中,参与者A无法接收协调者的通信,那么A会自动提交,但是提交失败了,其他参与者成功了,此时数据就会不一致。
Seata 中的 AT 模式
AT 模式是增强型2pc模式。
AT模式的角色:
·TM
·TC
协调者,管理全局事务
·RM
·undolog
·redolog
为什么要用redolog
两阶段提交协议的演变,没有一直锁表
·一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源
·二阶段:
·提交异步化,非常快速地完成
·或回滚通过一阶段的回滚日志进行反向补偿
Seata AT模式的例子
有个充值业务,现在有两个服务,一个负责管理用户的余额,另外一个负责管理用户的积分。
Seata AT分为两阶段,主要逻辑全部在第一阶段,第二阶段主要做回滚或日志清理的工作。
一阶段
二阶段-提交
二阶段-回滚
第一阶段流程:
第二阶段流程:
Client和TC之间是有长连接的,如果是正常全局提交,则TC通知多个RM异步清理掉本地的redo和undolog即可。如果是回滚,则TC通知每个RM回滚数据即可。
这里就会引出一个问题,由于本地事务都是自己直接提交了,后面如何回滚,由于我们在操作本地业务操作的前后,做记录了undo log和redo log,因此可以通过undo log进行回滚。
由于undolog和redo log和业务操作在同一个事务中,因此肯定会同时成功或同时失败。
注意:undo log是被修改前的数据,可以用于回滚;reod log是被修改后的数据,用于回滚校验。
全局锁
简单来说就是为了能够保证其他事务在当前事务还未释放全局锁时无法修改同一数值,实现了写的隔离.整个过程 全局锁 在当前全局事务结束前一直是被全局事物持有的,所以不会发生 脏写 的问题。
相比于传统XA(2PC)
优点:
其实这些也都是XA协议(传统2PC)的缺点
缺点:
高并发环境下,因为有全局锁的存在,性能可能会打折扣。例如对同一商品减库存,由于根据索引id做为条件,要等待锁释放。
------------待完善-----------------------