企业网站如何做优化,北京网站制作应用,枣庄市市中区建设路网站,专业网站建设经费申请报告文章目录分布式事务2PC#xff08;二阶段提交协议#xff09;执行流程优缺点3PC#xff08;三阶段提交协议#xff09;执行流程优缺点本地消息表#xff08;异步确保#xff09;分布式事务
分布式事务就是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分…
文章目录分布式事务2PC二阶段提交协议执行流程优缺点3PC三阶段提交协议执行流程优缺点本地消息表异步确保分布式事务
分布式事务就是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于分布式系统的不同节点之上。
简言之就是一次大的操作由不同的小操作组成这些小的操作分布在不同的服务器上且属于不同的应用分布式事务需要保证这些小操作要么全部成功要么全部失败。 本质上来说分布式事务就是为了保证不同数据库的数据一致性。 2PC二阶段提交协议
在分布式系统中每一个机器节点虽然都能够明确地知道自己在进行事务操作过程中的结果是成功或失败但是却无法直接获取到其他分布式节点的操作结果即无法同步结果一致性无法保证。
为了保证事务处理的 ACID 特性就需要引入一个称为协调者的组件来统一调度所有分布式节点的执行逻辑这些被调度的分布式节点则被称为参与者。协调者负责调度参与者的行为基于这个思想衍生出了二阶段提交和三阶段提交两种协议。
2PCTwo-Phase Commit 即二阶段提交是为了使基于分布式系统架构下的所有节点在进行事务处理过程中能够保持原子性和一致性而设计的一种算法。 执行流程
第一阶段的主要内容就是进行投票来表明是否有继续执行事务的必要。
阶段一提交事务请求投票阶段
事务询问 协调者向所有参与者发出事务询问询问是否可以执行事务操作并等待各参与者的响应。执行事务 各个参与者节点执行事务操作并将 undo 和 redo 信息记入事务日志中。各参与者向协调者反馈事务询问的响应 如果参与者成功执行事务则反馈 YES 响应否则反馈 NO 响应。开启第二阶段 协调者接收到所有参与者的 YES 响应后进入第二阶段。
在第二阶段中会根据第一阶段参与者的反馈来决定是否能够提交事务要么全都成功要么全都失败。
阶段二执行事务提交执行阶段
执行事务提交 发送提交请求 协调者向所有参与者发起提交请求。事务提交 参与者在收到提交请求后会正式执行事务提交操作。反馈事务提交结果 参与者在完成事务提交之后向协调者发送 ACK 消息。完成事务 协调者接收到所有参与者的 ACK 后完成事务。 中断事务第一阶段协调者未收到所有参与者的 YES 响应 发送回滚请求 协调者向所有参与者发起回滚请求。事务回滚 参与者在收到回滚请求后利用阶段一记录的 undo 信息来执行事务回滚操作。反馈事务回滚结果 参与者在完成事务回滚之后向协调者发送 ACK 消息。中断事务 协调者接收到所有参与者的 ACK 后完成事务中断。 优缺点
优点 原理简单实现方便 缺点 同步阻塞 在执行过程中所有参与该事务操作的逻辑都会处于阻塞状态也就是说各个参与者在等待其他参与者响应的过程中将无法执行其他操作。单点问题 在上述过程中协调者起到了核心的调度作用。一旦协调者出现了问题那么整个提交流程将无法运转甚至如果在二阶段的提交流程中出现了问题将导致其他参与者都处于锁定事务资源的状态中无法完成事务。数据不一致 倘若在第二阶段的提交过程中协调者向所有参与者发送提交请求由于网络原因导致只有部分参与者收到了提交请求此时就导致了只有接收到请求的参与者进行了事务提交而产生数据不一致的问题。过于保守 二阶段提交协议没有设计容错机制任意一个节点的失败都会导致整个事务的失败。 3PC三阶段提交协议
3PCThree-Phase Commit 即三阶段提交为了解决二阶段的缺陷其将二阶段提交协议的提交事务请求过程一分为二形成了由 CanCommit、PreCommit、DoCommint 三个阶段组成的事务处理协议
执行流程
阶段一CanCommit
事务询问各参与者向协调者反馈事务询问的响应
阶段二PreCommit 执行事务预提交 发送预提交请求事务预提交各参与者向协调者反馈事务执行的结果 中断事务 发送中断请求中断事务
阶段三DoCommit
执行提交 发送提交请求事务提交反馈事务提交结果完成事务 中断事务 发送中断请求事务回滚反馈事务回滚结果中断事务
需要注意的是在阶段三中可能会出现以下两种问题:
协调者出现问题单点问题协调者和参与者之间的网络出现故障网络拥塞
无论出现上述那种问题最终都会导致参与者无法及时的接收到来自协调者的 DoCommit 或是 Abort 请求针对这种异常情况参与者都会在等待超时后继续进行事务提交。
优缺点
优点 相较于二阶段提交协议降低了参与者的阻塞范围并且能够在出现单点故障后继续达成一致。缺点 三阶段提交协议在去除阻塞的同时也引入了新的问题那就是参与者在收到预提交的消息时如果出现了网络分区的情况协调者与参与者无法进行正常的网络通信但是参与者依旧会进行事务的提交从而导致数据的不一致。 本地消息表异步确保
本地消息表与业务数据表处于同一个数据库中这样就能利用本地事务来保证在对这两个表的操作满足事务特性并且使用了消息队列来保证最终一致性。
在分布式事务操作的一方完成写业务数据的操作之后向本地消息表发送一个消息本地事务能保证这个消息一定会被写入本地消息表中。之后将本地消息表中的消息转发到消息队列中如果转发成功则将消息从本地消息表中删除否则继续重新转发。在分布式事务操作的另一方从消息队列中读取一个消息并执行消息中的操作。 这里的消息队列不是单纯的数据结构而应该看作由标志和操作两部分共同组成的中间件用以标识某一操作是否成功只有当左侧的分布式节点确实完成了某项操作右侧的其他节点才有同步这项操作的必要。