抛砖引玉之 - 分布式事务
Posted 一点代码
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了抛砖引玉之 - 分布式事务相关的知识,希望对你有一定的参考价值。
不同于本地JDBC支持的事务功能,分布式事务将复杂度提升到了多个独立进程中,我们无法使用以往简单的方式去保证数据的一致性。 而出现问题则解决问题,在前人无数的文献之下,诞生了以下几种分布式事务的实现方案
-
一致性(Consistency):意思是,写操作之后的读操作,必须返回该值。数据都必须处于一致的状态。
-
可用性(Availability):意思是只要收到用户的请求,服务器就必须给出回应。
-
分区容错性(Partition tolerance):大多数分布式系统都分布在多个子网络。每个子网络就叫做一个区(partition)。 分区容错的意思是,区间通信可能失败。比如,一台服务器放在中国,另一台服务器放在美国,这就是两个区,它们之间可能无法通信。一般来说,分区容错无法避免,因此可以认为 CAP 的 P 总是成立。 CAP 定理告诉我们,剩下的 C 和 A 无法同时做到
在了解两阶段/三阶段提交协议之前,我们必须引入一个称之为事务协调器的组件,在一个事务跨越多个节点时,为了保持事务的ACID特性,因此需要它来统一掌握所有节点的操作结果,并最终指示这些节点是否真正提交或回滚。
-
Prepare(准备阶段):事务协调器(事务管理器)给每个参与者都发送Prepare消息,每个参与者要么直接返回失败,要么在本地执行事务,写本地的redo和undo日志但不提交。 -
Commit(提交阶段):如果协调器收到所有参与者的失败消息或者超时,则直接给每个参与者都发送回滚消息,否则发送提交消息。参与者根据事务管理器的指令执行提交或者回滚操作,并释放在所有事务处理过程中使用的锁资源。
-
同步阻塞问题:在执行过程中,所有参与者的任务都是阻塞执行的。 -
单点故障:所有请求都需要经过协调器,在协调器发生故障时,所有参与者都会被阻塞。 -
数据不一致:在二阶段提交的第2阶段,在协调器向参与者发送提交请求后发生了局部网络异常,或发送提交消息时部分参与者发生故障,则只有一部分参与者收到了提交消息,于是整个分布式系统出现了数据不一致的现象。
-
引入超时机制:在协调器和参与者中引入了超时机制,如果协调器长时间接受不到参与者的反馈,则认为参与者执行失败。 -
在第1阶段和第2阶段都加入了一个预准备阶段,以保证在最后的任务提交之前各个参与者节点的状态是一致的,也就是说,除了引入超时机制,三阶段提交协议(3PC)把两阶段提交协议(2PC)的准备阶段再次一分为二,这样三阶段提交就有了CanCommit、PreCommit、DoCommit三个阶段。
-
CanCommit阶段:协调器向参与者发送Commit请求,参与者如果可以提交就返回Yes响应,否则返回No响应。
-
PreCommit阶段:协调器根据参与者的反应来决定是否继续进行,有以下两种可能: -
假如协调器从所有参与者那里获得的反馈都是Yes响应,则预执行事务。 -
假如有任意参与者向协调器发送了No响应,或者在等待超时之后协调器都没有接收到参与者的响应,则执行事务的中断。
-
DoCommit阶段:该阶段进行真正的事务提交,主要包括:协调器发送提交请求,参与者提交事务,参与者响应反馈(在事务提交完成之后向协调器发送Ack响应),协调器确认完成事务。这个阶段如果有参与者未返回响应或返回的非Ack响应,则认为有部分节点提交失败或宕机。此时协调器会向所有参与者发送abort请求,参与者收到此请求后会利用在第2阶段写入的undo日志来执行事务回滚。
-
原子性(Atomicity) :事务是一个完整操作,参与事务的逻辑单元要么都执行,要么都不执行。
-
一致性(Consistency) :在事务执行完毕时,数据都必须处于一致的状态。
-
隔离性(Isolation) :对数据进行修改的所有并发事务都是彼此隔离的,它不应该以任何方式依赖或影响其他事务。
-
永久性(Durability) :在事务操作完成后,对数据库的修改将被持久化到永久性存储中。
如果觉得本文给您提供了帮助,请点击转发并关注获取更多内容
以上是关于抛砖引玉之 - 分布式事务的主要内容,如果未能解决你的问题,请参考以下文章