99网
您的当前位置:首页分布式事务理论基础

分布式事务理论基础

来源:99网

分布式事务理论基础

常见分布式事务解决方案
1、seata 阿里分布式事务框架
2、消息队列
3、saga
4、XA
他们有一个共同点,都是“两阶段(2PC)”。“两阶段”是指完成整个分布式事务,划分成两个步骤完成。
这四种常见的分布式事务解决方案,分别对应着 分布式事务的四种模式:AT、TCC、Saga、XA;四种分布式事务模式,都有各自的理论基础,分别在不同的时间被提出;每种模式都有它的适用场景,同样每个模式也都诞生有各自的代表产品;而这些代表产品,可能就是我们常见的(全局事务、基于可靠消息、最大努力通知、TCC)。

解决分布式事务,也有相应的规范和协议。分布式事务相关的协议有2PC、3PC。由于 三阶段提交协议3PC 非常难实现,目前市面主流的分布式事务解决方案都是2PC协议。目前绝大多数分布式解决方案都是以两阶段提交协议2PC为基础的。TCC(Try-Confirm-Cancel) 实际上是服务化的两阶段提交协议。

2PC两阶段提交协议:

PC(两阶段提交,Two-Phase Commit)顾名思义,分为两个阶段:Prepare 和 Commit

Prepare:提交事务请求

基本流程如下:

1,询问 协调者向所有参与者发送事务请求,询问是否可执行事务操作,然后等待各个参与者的响应。

2,执行 各个参与者接收到协调者事务请求后,执行事务操作(例如更新一个关系型数据库表中的记录),并将Undo 和 Redo 信息记录事务日志中。参与者处于阻塞状态不能做其他的事情。

3,响应 如果参与者成功执行了事务并写入 Undo 和 Redo 信息,则向协调者返回 YES 响应,否则返回 NO响应。当然,参与者也可能宕机,从而不会返回响应。

Commit:执行事务提交
正常提交事务

流程如下图:

执行事务提交分为两种情况,正常提交和回退。

1,commit 请求 协调者向所有参与者发送 Commit 请求。

2,事务提交 参与者收到 Commit 请求后,执行事务提交,提交完成后释放事务执行期占用的所有资源。

3,反馈结果 参与者执行事务提交后向协调者发送 Ack 响应。

4,完成事务 接收到所有参与者的 Ack 响应后,完成事务提交。

中断事务

在执行 Prepare 步骤过程中,如果某些参与者执行事务失败、宕机或与协调者之间的网络中断,那么协调者就无法收到所有参与者的 YES 响应,或者某个参与者返回了 No 响应,此时,协调者就会进入回退流程,对事务进行回退。流程如下图红色部分(将 Commit 请求替换为红色的 Rollback 请求):

1,rollback 请求 协调者向所有参与者发送 Rollback 请求。

2,事务回滚 参与者收到 Rollback 后,使用 Prepare 阶段的 Undo 日志执行事务回滚,完成后释放事务执行期占用的所有资源。

3,反馈结果 参与者执行事务回滚后向协调者发送 Ack 响应。

4,中断事务 接收到所有参与者的 Ack 响应后,完成事务中断。

2PC 的问题

分布式解决方式--AT模式

AT模式设计原理如上,

AT模式前提:基于支持本地 ACID 事务的关系型数据库。Java 应用,通过 JDBC 访问数据库。

整体机制:

两阶段提交协议的演变:

  • 一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。
  • 二阶段:
    • 提交异步化,非常快速地完成。
    • 回滚通过一阶段的回滚日志进行反向补偿。

AT 模式是一种无侵入的分布式事务解决方案。阿里seata框架,实现了该模式。

在 AT 模式下,用户只需关注自己的“业务 SQL”,用户的 “业务 SQL” 作为一阶段,Seata 框架会自动生成事务的二阶段提交和回滚操作。

AT 模式如何做到对业务的无侵入 :
一阶段:

在一阶段,Seata 会拦截“业务 SQL”,首先解析 SQL 语义,找到“业务 SQL”要更新的业务数据,在业务数据被更新前,将其保存成“before image”,然后执行“业务 SQL”更新业务数据,在业务数据更新之后,再将其保存成“after image”,最后生成行锁。以上操作全部在一个数据库事务内完成,这样保证了一阶段操作的原子性。

二阶段提交:

二阶段如果是提交的话,因为“业务 SQL”在一阶段已经提交至数据库, 所以 Seata 框架只需将一阶段保存的快照数据和行锁删掉,完成数据清理即可。

二阶段回滚:

二阶段如果是回滚的话,Seata 就需要回滚一阶段已经执行的“业务 SQL”,还原业务数据。回滚方式便是用“before image”还原业务数据;但在还原前要首先要校验脏写,对比“数据库当前业务数据”和 “after image”,如果两份数据完全一致就说明没有脏写,可以还原业务数据,如果不一致就说明有脏写,出现脏写就需要转人工处理。

AT 模式的一阶段、二阶段提交和回滚均由 Seata 框架自动生成,用户只需编写“业务 SQL”,便能轻松接入分布式事务,AT 模式是一种对业务无任何侵入的分布式事务解决方案。

总结;利用业务的SQL,全自动的帮我们进行事务的提交, 提交第一阶段完成了同时第一阶段进行了行锁。如果第二阶段是提交的话就会把行锁删除其他的线程就可以查到这条数据了。如果是第二阶段是回滚的话把before image逆向的生成update SQL语句,然后还原回去。

因篇幅问题不能全部显示,请点此查看更多更全内容