手写 2PC 协议

这篇具有很好参考价值的文章主要介绍了手写 2PC 协议。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1. 2PC 介绍

2. 2PC 协议流程

阶段一 PREPARE

阶段二 COMMIT / ROLLBACK

 3. 2PC 手写

模块说明

源码介绍

2PC 模块

 transaction-manager

 resource-manager 模块


1. 2PC 介绍

2PC 协议(Two Phase Commit)是一个分布式事务协议。

2PC 为两阶段提交,分为两个阶段。两个角色。

        1. PREPARE

        2. COMMIT / ROLLBACK

2PC 有两个角色

        1. Transaction Manger / TM 事务管理者

        2. Resouce Manager / RM 资源管理者

2. 2PC 协议流程

阶段一 PREPARE

事务管理者 TM 向 所有资源节点 发送 PREPARE 请求

目的

1. 让所有 RM 节点先记录上 REDO 日志,下一阶段看情况才做真正提交

2. 询问所有节点是否都准备好了,此时的请求是轻量的,如果有的节点觉得自己情况不好(或者网络不好),直接返回 FAIL,取消此次事务。

手写 2PC 协议

 RM 收到消息后 需要返回 ACK 告知 TM 自己是否准备好了

此时暴露出 2PC 缺点:需要等到全部 RM 节点都准备好了才能进入到下一个阶段,将所有节点都同步化了。

此时暴露出 2PC 缺点:TM 单点故障问题

RM 返回 ACK 存在三种情况

1. 所有 RM 返回 OK

既然所有节点都准备好了,那就可以进入下一阶段 COMMIT,执行提交操作

手写 2PC 协议

2. 存在节点返回 FAIL

代表有节点没准备好,进入下一阶段 ROLLBACK 执行回滚操作

手写 2PC 协议

3. 存在节点返回超时(TM 没有收到 ACK)

代表有节点出现问题,进入下一阶段 ROLLBACK 执行回滚操作

手写 2PC 协议

阶段二 COMMIT / ROLLBACK

COMMIT

可见,当只有全部节点都返回 OK 时,才会进入 COMMIT 阶段

TM 开始发送 COMMIT 请求,此时 2PC 协议完成

此时暴露出 2PC 缺点1:如果有的RM节点的 COMMIT 请求没有收到,将会导致与其他 RM 节点数据不一致。

此时暴露出 2PC 缺点2:RM 节点收到 COMMIT 请求后出现出现异常了,此时如何处理,2PC 没有规定。

手写 2PC 协议

ROLLBACK

开始对所有节点发送 ROLLBACK 请求

手写 2PC 协议

 3. 2PC 手写

完整代码已上传到 GIT https://gitee.com/sixsixsix516/SUN-2PC

模块说明

手写 2PC 协议

  • transaction-manager  TM 事务管理者
  • resource-manager RM 资源管理者
  • 2PC 客户端 入口类

源码介绍

2PC 模块

1. ResourceManager  代表一个 RM 节点

手写 2PC 协议

2. TransactionManager 代表一个 TM 节点

TM 具有行为

  • start 启动事务
  • register 向 TM 上注册一个 RM 节点

这里都是发送一个 HTTP 请求给 transaction-manager 模块

手写 2PC 协议

 主类

手写 2PC 协议

 transaction-manager

ResourceManagerClient 代表一个 RM 客户端

这里的 HTTP 请求会发送给 resource-manager 模块

手写 2PC 协议

TransactionManager 事务管理者

prepare 方法是核心方法,可仔细观看

手写 2PC 协议

手写 2PC 协议

 resource-manager 模块

ResourceManager

这里意思一下,哈哈哈

手写 2PC 协议

 完整代码已上传到 GIT https://gitee.com/sixsixsix516/SUN-2PC文章来源地址https://www.toymoban.com/news/detail-405670.html

到了这里,关于手写 2PC 协议的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 从2PC和容错共识算法讨论zookeeper中的Create请求 | 京东云技术团队

    最近在读《数据密集型应用系统设计》,其中谈到了zookeeper对容错共识算法的应用。这让我想到之前参考的zookeeper学习资料中,误将容错共识算法写成了2PC(两阶段提交协议),所以准备以此文对共识算法和2PC做梳理和区分,也希望它能帮助像我一样对这两者有误解的同学。

    2024年02月15日
    浏览(33)
  • PBFT常见问题:为什么是f+1、2f+1、3f+1?prepare阶段和commit阶段的作用?恶意节点如何作恶?

    目录 说明 1、为什么客户端要收到f+1个执行结果相同的reply才能确认? 2、为什么prepare和commit阶段需要2f+1个确认? 3、为什么副本总数是3f+1? 4、能不能去掉prepare阶段?为什么有prepare阶段? 5、能不能去掉commit阶段?为什么有commit阶段? 6、视图变换何时提出?怎样开始?过

    2024年02月02日
    浏览(45)
  • 【学习】从零开始的Android音视频开发(3)——MediaPlayer的prepare/prepareAsync流程和start流程

    在之前的流程中我们没有从MediaPlayer生态上认识各类库之间的依赖调用关系 MediaPlayer部分头文件在frameworks/base/include/media/目录中,这个目录和libmedia.so库源文件的目录frameworks/av/media/libmedia/相对应。主要头文件有 IMediaPlayerClient.h、mediaplayer.h、IMediaPlayer.h、IMediaPlayerService.h、Med

    2024年02月03日
    浏览(44)
  • JavaScript实现手写签名,可触屏手写,支持移动端与PC端双端保存

    1.HTML模板 2.获取DOM元素和定义变量 3.创建两个canvas元素,并设置它们的宽度和高度 4.绑定触摸事件:touchstart, touchmove, touchend和click 5.实现触摸事件回调函数:startDrawing, draw和stopDrawing 6.实现绘制线段的函数:drawLine 7.实现清除签名的函数:clearSignature 8.实现保存签名的函数:

    2024年01月16日
    浏览(49)
  • 【手写数据库toadb】01 开发数据库内核准备阶段-开发环境准备

    ​ 专栏内容 : 手写数据库toadb 本专栏主要介绍如何从零开发,开发的步骤,以及开发过程中的涉及的原理,遇到的问题等,让大家能跟上并且可以一起开发,让每个需要的人成为参与者。 本专栏会定期更新,对应的代码也会定期更新,每个阶段的代码会打上tag,方便阶段学

    2024年01月22日
    浏览(48)
  • 【手写数据库toadb】02 开发数据库内核准备阶段-git工具使用

    ​ 专栏内容 : 手写数据库toadb 本专栏主要介绍如何从零开发,开发的步骤,以及开发过程中的涉及的原理,遇到的问题等,让大家能跟上并且可以一起开发,让每个需要的人成为参与者。 本专栏会定期更新,对应的代码也会定期更新,每个阶段的代码会打上tag,方便阶段学

    2024年01月24日
    浏览(44)
  • Vue基础入门(2)- Vue的生命周期、Vue的工程化开发和脚手架、Vue项目目录介绍和运行流程

    Vue生命周期:就是一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个阶段: ① 创建 ② 挂载 ③ 更新 ④ 销毁 1.创建阶段:创建响应式数据 2.挂载阶段:渲染模板 3.更新阶段:修改数据,更新视图 watch 是监听的数据修改就触发, updated 是整个组件的dom更新才触发 4.销毁

    2024年03月10日
    浏览(60)
  • 分布式事务(4):两阶段提交协议与三阶段提交区别

    1 两阶段提交协议 两阶段提交方案应用非常广泛,几乎所有商业OLTP数据库都支持XA协议。但是两阶段提交方案锁定资源时间长,对性能影响很大,基本不适合解决微服务事务问题。 缺点: 如果协调者宕机,参与者没有协调者指挥,则会一直阻塞。、 如下图: 第一阶段: 准

    2024年02月11日
    浏览(42)
  • 手写Springboot核心流程

    目录 Springboot启动流程 核心代码 验证效果 创建Spring容器, 扫描并启动 容器选择Tomcat/Jetty 创建DispatchServlet, 与spring容器绑定 将DispatchServlet添加到Tomcat 启动Tomcat 1. 首先, 创建两个module  2. maven依赖 springboot模块依赖 user模块依赖 3. springboot核心配置类  4. Import自动配置类  spi注入

    2024年02月01日
    浏览(37)
  • 如何手写网络协议栈

    哈喽,我是子牙,一个很卷的硬核男人。喜欢研究底层,聚焦做那些大家想学没地方学的课程:手写操作系统、手写虚拟机、手写编程语言…目前做了两门课:手写OS、手写JVM 今天想跟大家聊一个黑科技:手写网络协议栈。为什么说它是黑科技呢?因为这玩意是网络黑客从事

    2024年02月08日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包