78、分布式事务解决方案

news/2024/11/28 15:44:00/

分布式事务解决方案

XA规范: 分布式事务规范,定义了分布式事务模型

四个角色: 事务管理器(协调者TM)、资源管理器(参与者RM),应用程序AP,通信资源管理器CRM

全局事务:一个横跨多个数据库的事务,要么全部提交、要么全部回滚

JTA事务时java对XA规范的实现,对应JDBC的单库事务

两阶段协议:
在这里插入图片描述
1、第一阶段 ( prepare ):每个参与者执行本地事务但不提交,进入 ready 状态,并通知协调者已经准备就绪

2、第二阶段 (commit) :当协调者确认每个参与者都 ready 后,通知参与者进行 cmmit 操作;如果有参与者 fail,则发送 rollback 命令,各参与者做回滚。

问题:

  • 单点故障:一旦事务管理器出现故障,整个系统不可用(参与者都会阻塞住)
  • 数据不一致::在阶段二,如果事务管理器只发送了部分 commit 消息,此时网络发生异常,那么只有部分参与者接收到 commit 消息,也就是说只有部分参与者提交了事务,使得系统数据不一致。
  • 响应时间较长:参与者和协调者资源都被锁住,提交或者回滚之后才能释放
  • 不确定性:当协事务管理器发送 commit 之后,并且此时只有一个参与者收到了 commit,那么当该参与者与事务管理器同时宕机之后,重新选举的事务管理器无法确定该条消息是否提交成功。

三阶段协议:主要是针对两阶段的优化,解决了2PC单点故障的问题,但是性能问题和不一致问题仍然没有根本解决

在这里插入图片描述
引入了超时机制解决参与者阻塞的问题,超时后本地提交,2pc只有协调者有超时机制

  • 第一阶段:CanCommit阶段,协调者询问事务参与者,是否有能力完成此次事务。

    如果都返回yes,则进入第二阶段
    有一个返回no或等待响应超时,则中断事务,并向所有参与者发送abort请求

  • 第二阶段:PreCommit阶段,此时协调者会向所有的参与者发送PreCommit请求,参与者收到后开始执行事务操作。参与者执行完事务操作后(此时属于未提交事务的状态),就会向协调者反馈”Ack”表示我已经准备好提交了,并等待协调者的下一步指令。

  • 第三阶段:DoCommit阶段,在阶段二中如果所有的参与者节点都返回了Ack,那么协调者就会从”预提交状态”转变为”提交状态”。然后向所有的参与者节点发送”doCommit"请求,参与者节点在收到提交请求后就会各自执行事务提交操作,并向协调者节点反馈”Ack”消息,协调者收到所有参与者的Ack消息后完成事务。相反,如果有一个参与者节点未完成PreCommit的反馈或者反馈超时,那么协调者都会向所有的参与者节点发送abort请求,从而中断事务。

TCC (补偿事务) : Try、Confirm、Cancel

  • 针对每个操作,都要注册一个与其对应的确认和补偿(撤销)操作

  • Try操作做业务检查及资源预留,Confirm做业务确认操作,Cancel实现一个与Try相反的操作即回滚操作。TM首先发起所有的分支事务的try操作,任何一个分支事务的try操作执行失败,TM将会发起所有分支事务的Cancel操作,若try操作全部成功,TM将会发起所有分支事务的Confirm操作,其中Confirm/Cancel操作若执行失败,TM会进行重试

  • TCC模型对业务的侵入性较强,改造的难度较大,每个操作都需要有 try、confirm、cance1三个接口实现

  • confirm 和 cancle 接口还必须实现幂等性

消息队列的事务消息:

  • 发送prepare消息到消息中间件
  • 发送成功后,执行本地事务
    如果事务执行成功,则commit,消息中间件将消息下发至消费端 (commit前,消息不会被消费)。
    如果事务执行失败,则回滚,消息中间件将这条prepare消息删除
  • 消费端接收到消息进行消费,如果消费失败,则不断重试

http://www.ppmy.cn/news/957455.html

相关文章

Chatgpt AI聊天实现,技术NodeJs+uni-app+eventsource,流式响应,支持上下文聊天

前端程序员的AI聊天小应用体验分享 最近空闲出点时间,作为一名前端程序员,我一直对人工智能(AI)技术充满了好奇和热情。最近,我开发了一个AI聊天小应用,大家想体检的可以私聊我或者V:155278082…

altium designer OUTPUT FILE Analysis

设计完PCB后,会导出相关光绘文件发给板厂打板,针对AD导出的各个光绘文件,我记录下了它们各个文件对应的层如下: GTL: Top Layer 顶层线路 GBL: Bottom Layer 底层线路 G1,G2… : Mid Layer 1, 2, … 中间信号层 GP1,GP2…: Internal Plane Layer 1, 2, …内电层 G…

DAppStore率先集成ChatGPT助力App安全开发

人工智能技术发展与应用拓展正暴风式席卷全球,为数字化转型升级带来全新机遇。DAppStore率先集成ChatGPT ,将ChatGPT和移动安全领域的众多场景结合起来,提供安全开发指南和安全代码示例,帮助开发者提升App安全防护能力。 近日,Cha…

ChatGPT自动开发SwiftUI App

ChatGPT 是 OpenAI 的一个演示项目,可以就许多话题进行对话。包括编程。 让我们逐步了解它,好吗? ChatGPT 从这一点开始接下来的一切都是我的输入提示,然后是 ChatCGP 的响应,并附有示例代码。 嘿 ChatGPT,你能制作一个包含名称、地址、城市、州和邮编字段的 SwiftUI …

原生信息流广告APP应用内增收及计费模式

比起传统的广告宣传,信息流最大的优势就在于流量的庞大。与此同时,多样化的信息流广告形式和精准的定向,还可以帮助广告主准确获取意向流量。此外,它的广告形式不强迫推送,因此也受到了广泛用户的支持和青睐。 原生信…

ChatGpt的使用感悟和使用局限

GPT3未出现以前的生活 当我写博客和论文时 心想:啊~~~~ 怎么办,马萨卡,我真的永远都无法敲出结果来了! 写完内容后的我 终于可以睡了!!! 天啊,这是我一个本科生该有的生活吗…

如何缩短 js 解析时间,如何优化首屏(延迟加载)

缩短js解析时间 代码优化 避免全局查找(沿着作用域链找需要时间),避免闭包,用数据结构等 减小js的大小:压缩和混淆 压缩 剔除没用到的代码,把长表达式转换成同含义的短表达式等 语法转换和优化&#…

使用3DS Max 创建未来派螺栓枪模型

推荐: NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 步骤 1 创建一个框并将其转换为可编辑多边形(右键单击>转换为:>转换为可编辑多边形),然后使用连接添加一系列边循环,如下图所示。 步骤 2 …