聊聊数据库中的 savepoint

2023-11-16

从全局二级索引讲起

故事要从全局二级索引开始讲起。 当我们构建了一个全局二级索引之后,一条逻辑上的数据插入,就会变成两条物理上的数据插入:一条插入到主表,另一条插入到索引表。为了保证主表和索引表数据的一致性,我们往往需要开启分布式事务,再并行地插入两条数据。如果其中一条数据插入失败了,比如索引上出现了唯一键冲突,但主表的数据已经插了进去,怎么办呢?当然,我们可以简单粗暴地回滚整个事务,来保证数据的一致性。 但有的时候,我们已经在事务里执行了大量的操作,这时候仅仅因为一条数据的插入失败,就要回滚整个事务,代价实在太大。对于单机 MySQL 来说,如果出现了这种插入 UK 报唯一键冲突的情况,会自动回滚这条插入的语句。至于是忽略报错继续执行事务,还是回滚整个事务,则交给业务方来决定。作为一款全面兼容 MySQL 的分布式数据库,PolarDB-X 自然也要具备这种特性。 其实,不只是全局二级索引的情况,其他场景比如 batch insert/delete/update、广播表 DML 等都可能会遇到这种情况。

聊聊 savepoint

如果要回滚单条或多条语句,而非回滚整个事务,我们自然想到使用 savepoint 这一功能。在事务中,我们可以随时设置一个 savepoint,后续再回滚到这个 savepoint,从而回滚 savepoint 后的所有操作。 MySQL 是如何实现 savepoint 能力的呢? MySQL 在 server 层中,对每个事务对象维护了一个 savepoint 的链表,用于记录这个事务设置过的 savepoint 对象。其中,每个 savepoint 对象主要记录了 savepoint 的名字,用于标识不同的 savepoint 对象。 在设置一个 savepoint 时,会往链表末尾插入一个 savepoint 对象。在释放一个 savepoint 时,会根据 savepoint 名字遍历链表,找到对应的 savepoint 对象,将其及其后面的所有 savepoint 删除。在回滚一个 savepoint 时,会找到对应的 savepoint 对象,根据其存储的信息进行回滚操作,随后,还会隐式释放掉其后的所有 savepoint(不包括它自己)。 可以看到,每个 savepoint 对象都需要存储一定的信息,来告诉 binlog 和 innodb 需要回滚到什么位置。对于 binlog 记录的是设置 savepoint 时的 binlog cache 的 offset;对于 innodb,则是设置 savepoint 时 undo log 的 undo number。这两个简单的信息,就足够 binlog 和 innodb 完成回滚操作了。 事实上,innodb 内部还维护了事务的 savepoint 链表,但本质上和上述说的链表没什么太大差异,就不展开讨论了。

使用 savepoint 解决问题

那 PolarDB-X 该如何使用 DN 的 savepoint 解决一开始提到的全局二级索引的问题呢? 其实做法也很简单,我们只需要在任何物理语句执行之前,加上一个 savepoint,在所有物理语句执行之后,视情况来回滚或是释放 savepoint。我们将这一行为称为 auto-savepoint。 其实,innodb 的行为也是如此,其在每条语句前(实际是上一条语句执行后),会更新一个匿名的 savepoint 对象 last_sql_stat_start,其保存了上一条语句执行后的 undo number。在当前语句执行出错时,通过这个 undo number 来回滚掉这条语句的操作。 熟悉 PolarDB-X 的同学一定知道,PolarDB-X 通过物理连接(计算节点到存储节点的连接)来执行物理 SQL。对于一条逻辑更新 GSI 的 SQL 语句,可能需要使用 2 条物理连接,执行 3 条物理 SQL(一条主表 update,一条 GSI 表删除,一条 GSI 表插入)。如下所示:

物理连接 0(物理分库 0): 
update primary_tb; insert gsi_tb; 
物理连接 1(物理分库 1): 
delete gsi_tb;

设置 auto-savepoint 的关键就在于要在合适的时机设置 savepoint。在这个例子中,任何一个物理连接执行出错,都会通知其他连接中断其正在执行的操作。假设在物理连接 1 执行 delete gsi_tb 的时候报错了,我们不知道物理连接 0 上的具体执行情况。哪些语句执行成功了、哪些语句执行失败了、哪些语句还没开始执行,我们都不知道。此时,我们可以借助 savepoint 的能力,不管具体的执行情况如何,都统一回滚到一切操作还没开始做的状态,就能达到回滚单条逻辑 SQL 的效果。 因此,我们自动设置的 savepoint 行为就是:

物理连接 0(物理分库 0): 
savepoint `s0`; update primary_tb; insert gsi_tb; rollback to savepoint `s0`;
物理连接 1(物理分库 1): 
savepoint `s0`; delete gsi_tb (ERROR); rollback to savepoint `s0`;

当然,这里面的设计还会保证参与了一条逻辑 SQL 的所有物理连接都正确设置上 savepoint,以保证 savepoint 的设置和回滚都不会漏掉,否则就会出现数据不一致的问题了。

代价是什么

我们通过 DN 的 savepoint 能力,来实现 CN 层面上的回滚单条语句的功能。尽管从前面的讨论来看,设置和释放 savepoint 的代价都比较低,只是在链表上新增或删除一个元素,但我们还是需要在实现上尽量减轻这种代价。 首先,我们尽量避免 savepoint 的设置,只在涉及 GSI 或其他逻辑执行的 DML 时,才自动设置 savepoint。因为只有在逻辑执行下,才可能发生分片间不一致的场景,才需要 auto-savepoint 来保证逻辑语句的原子性。其次,我们设置和释放都是通过多语句的方式,将 savepoint 的 SQL 和业务产生的物理 SQL 一并下发,避免增加额外的 RTT。最后,我们还使用了私有协议绕过 savepoint SQL 的解析过程,直接在 DN 上调用设置和释放 savepoint 的代码。

作者:勿遮

点击立即免费试用云产品 开启云上实践之旅!

原文链接

本文为阿里云原创内容,未经允许不得转载。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

聊聊数据库中的 savepoint 的相关文章

  • mysql+关掉密码过期

    mysql 关掉密码过期 要在MySQL中关闭密码过期功能 可以按照以下步骤进行操作 登录到MySQL服务器 使用管理员账户 如root 连接到数据库 mysql uroot ppassword 运行以下命令来查看当前的密码过期设置 SHO
  • 【计算机开题报告】二手车交易平台

    一 选题依据 简述国内外研究现状 生产需求状况 说明选题目的 意义 列出主要参考文献 选题目的 意义 如今时代网络技术正在快速发展 电子商务技术也以极为强势的姿态闯入人们的视野之中 随着人们生活质量的提升 为了对身边二手物品进行回收利用 二
  • 【计算机开题报告】 医药信息管理系统

    一 选题依据 简述国内外研究现状 生产需求状况 说明选题目的 意义 列出主要参考文献 1 研究背景 随着医药事业的不断壮大 相关单位对于医药信息的管理变得越来越重要 传统的手工管理效率低 易出错 费时费力 不能及时精确的收集 传递 存储 加
  • 【计算机开题报告】图书管理系统

    一 选题依据 简述国内外研究现状 生产需求状况 说明选题目的 意义 列出主要参考文献 国内外研究现状 国外研究现状 在很多发达国家 图书管理系统的应用和技术发展已经相对完善 并且还建立了数字图书馆 各方面的情况也非常成熟 而图书管理的应用价
  • 实时获取建材网商品数据:API实现详解与代码示例

    一 引言 随着电子商务的快速发展 实时获取商品数据对于企业决策 市场分析以及数据驱动的营销策略至关重要 建材网作为国内知名的建材信息平台 提供了API接口 使得第三方开发者可以方便地获取商品数据 本文将详细介绍如何使用 建材网的API接口
  • 进程间通信

    进程间通信 进程间通信介绍 进程间通信目的 数据传输 一个进程需要将它的数据发送给另一个进程 资源共享 多个进程之间共享同样的资源 通知事件 一个进程需要向另一个或一组进程发送消息 通知它 它们 发生了某种事件 如进程终止 时要通知父进程
  • SQL 解析与执行流程

    一 前言 在先前的技术博客中 我们已经详细介绍过数据库的 parser 模块与执行流程 用户输入的 SQL 语句通过词法解析器生成 token 再通过语法分析器生成抽象语法树 AST 经过 AST 生成对应的 planNode 最后执行 p
  • Qt源码分析:Qt程序是怎么运行起来的?

    一 从 exec 谈起 一个标准的Qt gui程序 在启动时我们会coding如下几行简洁的代码 include widget h include
  • 【Mysql】InnoDB 引擎中的页目录

    一 页目录和槽 现在知道记录在页中按照主键大小顺序串成了单链表 那么我使用主键查询的时候 最顺其自然的办法肯定是从第一条记录 也就是 Infrimum 记录开始 一直向后找 只要存在总会找到 这种在数据量少的时候还好说 一旦数据多了 遍历耗
  • 【计算机毕业设计】基于web的山东红色旅游信息管理系统

    有效的处理想要的相关信息和如何传播有效的信息 一直是人类不断探索的动力 人类文明火种的传承都是通过了多种媒介作为载体 也是随着社会生产力的发展不断的更新 随着互联网的到来 信息传播与管理都上升了一个新的台阶 并且方便应用的同时也要考虑信息传
  • 【计算机毕业设计】学生就业管理系统

    如今社会上各行各业 都喜欢用自己行业的专属软件工作 互联网发展到这个时候 人们已经发现离不开了互联网 新技术的产生 往往能解决一些老技术的弊端问题 因为传统学生就业信息管理难度大 容错率低 管理人员处理数据费工费时 所以专门为解决这个难题开
  • 通俗易懂,十分钟读懂DES,详解DES加密算法原理,DES攻击手段以及3DES原理

    文章目录 1 什么是DES 2 DES的基本概念 3 DES的加密流程 4 DES算法步骤详解 4 1 初始置换 Initial Permutation IP置换 4 2 加密轮次 4 3 F轮函数 4 3 1 拓展R到48位 4 3 2
  • 基于java的学生宿舍管理系统设计与实现

    基于java的学生宿舍管理系统设计与实现 I 引言 A 研究背景和动机 基于Java的学生宿舍管理系统设计与实现的研究背景和动机 在数字化时代的推动下 学生宿舍管理系统已经成为了管理学生宿舍的重要工具 学生宿舍管理系统能够帮助管理者更好地管
  • 【计算机毕业设计】电影播放平台

    电影播放平台采用B S架构 数据库是MySQL 网站的搭建与开发采用了先进的java进行编写 使用了springboot框架 该系统从两个对象 由管理员和用户来对系统进行设计构建 主要功能包括 个人信息修改 对用户 电影分类 电影信息等功能
  • 【计算机毕业设计】二手家电管理平台

    时代在飞速进步 每个行业都在努力发展现在先进技术 通过这些先进的技术来提高自己的水平和优势 二手家电管理平台当然不能排除在外 二手家电管理平台是在实际应用和软件工程的开发原理之上 运用java语言以及前台VUE框架 后台SpringBoot
  • 【计算机毕业设计】宝鸡文理学院学生成绩动态追踪系统

    研究开发宝鸡文理学院学生成绩动态追踪系统的目的是让使用者可以更方便的将人 设备和场景更立体的连接在一起 能让用户以更科幻的方式使用产品 体验高科技时代带给人们的方便 同时也能让用户体会到与以往常规产品不同的体验风格 与安卓 iOS相比较起来
  • 【计算机毕业设计】springbootstone音乐播放器的设计与实现

    随着我国经济的高速发展与人们生活水平的日益提高 人们对生活质量的追求也多种多样 尤其在人们生活节奏不断加快的当下 人们更趋向于足不出户解决生活上的问题 stone音乐播放器展现了其蓬勃生命力和广阔的前景 与此同时 为解决用户需求 stone
  • 【计算机毕业设计】OA公文发文管理系统_xtv98

    近年来 人们的生活方式以网络为主题不断进化 OA公文发文管理就是其中的一部分 现在 无论是大型的还是小型的网站 都随处可见 不知不觉中已经成为我们生活中不可或缺的存在 随着社会的发展 除了对系统的需求外 我们还要促进经济发展 提高工作效率
  • 网页订货系统的诸多优势|企业APP订单管理软件

    1 订单信息 发货信息 账目信息一目了然 生产企业 总代理 和分销商之间可以清楚直观的了解到商品和货款的实时状态 以便高效的订货 发货 进行货款催收以及商品的物流跟踪 2 建立稳固的客户关系 避免客户被竞争对手挖墙脚 有了网上订货系统 企业
  • MongoDB - 库、集合、文档(操作 + 演示 + 注意事项)

    目录 一 MongoDB 1 1 简介 a MongoDB 是什么 为什么要使用 MongoDB b 应用场景 c MongoDB 这么强大 是不是可以直接代替 MySQL d MongoDB 中的一些概念 e Docker 下载 1 2

随机推荐

  • TCP协议(三次握手)

    TCP Transmission Control Protocol 协议的全称是传输控制协议 它负责为不同终端系统的应用进程之间提供面向连接的通信服务 即TCP协议能够对自己提供的连接实施控制 它是一种可靠的传输层协议 一 TCP协议简介
  • 西门子PPI通讯协议

    过硬件和软件侦听的方法 分析PLC内部固有的PPI通讯协议 然后上位机采用VB编程 遵循PPI通讯协议 读写PLC数据 实现人机操作任务 这种通讯方法 与一般的自由通讯协议相比 省略了PLC的通讯程序编写 只需编写上位机的通讯程序资源S7
  • 磁环相关的计算公式

    磁环相关的计算公式 公式来源 收集于各大网站 公式仅供参考 如有错误或不全的 欢迎留言指出 通过查磁环手册或咨询供应商可知的固有量 磁环外径 D 单位mm 磁环内径 d 单位mm 磁环高度 h 单位mm 磁环芯材磁导率 u 可推导的量 导磁
  • Java 获取两个List的交集和差集,以及应用场景

    背景介绍 在实际项目中 特别是一些管理后台类的项目 会遇到底层数据是按照一对多关系的数据表存储的管理界面 列表页是一对多关系中一对应的数据列表 二级的详情页中是一对多关系中多对应的多条数据展示 通常二级页面是能够增 删 改数据的编辑页面 在
  • 使用 pymysql 操作MySQL数据库

    安装PyMySQL PyMySQL是一个Python编写的MySQL驱动程序 让我们可以用Python语言操作MySQL数据库 首先 使用pip安装PyMySQL pip install PyMySQL 使用PyMySQL 简单使用 如果有
  • Redis学习笔记①基础篇_Redis快速入门

    若文章内容或图片失效 请留言反馈 部分素材来自网络 若不小心影响到您的利益 请联系博主删除 资料链接 https pan baidu com s 1189u6u4icQYHg 9 7ovWmA 提取码 eh11 在线视频 https www
  • Android Jetpack Compose之状态持久化与恢复

    目录 1 概述 2 实例解析 4 Compose提供的MapSaver和ListSaver 4 1 mapServer 4 2 ListSaver 1 概述 在之前的文章中 我们提到了remember 我们都知道remember可以缓存创建
  • 华为云技术开放日(第三季)活动报道

    智能共生 链接未来 华为云技术开放日 第三季 精彩回顾 7 月 29日 8 月 12 日 由华为云与中生代技术社区联合主办的华为云技术开放日 第三季 圆满落下帷幕 本次技术开放日邀请了华为云 MVP 李弋凡 华为公司5G产品线首席架构师廖尔
  • 虚函数与虚函数表

    虚函数与虚函数表 一 概述 为了实现C 的多态 C 使用了一种动态绑定的技术 这个技术的核心是虚函数表 下文简称虚表 本文介绍虚函数表是如何实现动态绑定的 二 类的虚表 每个包含了虚函数的类都包含一个虚表 我们知道 当一个类 A 继承另一个
  • LeetCode 189. 轮转数组

    前言 Wassup guys 我是Edison 今天是 LeetCode 上的 leetcode 189 轮转数组 Let s get it 文章目录 1 题目分析 2 题目图解 思路一 右旋 k 次 依次移动一个 思路二 额外开数组 思路
  • 【学习笔记之操作系统原理篇】进程管理

    进程的概念 进程 单道程序 特点 顺序性 封闭性 独占性 可再现性 多道程序系统 特点 间断性 相互制约竞争资源 失去封闭性 共性资源 多个程序操作相同资源 不可再现性 运行结果不唯一 因为执行顺序不唯一 进程特征 动态性 一个进程可以对应
  • 写博客有哪些好用的工具和软件?

    写博客有哪些好用的工具和软件 在各种平台上写文章 要有一个好用的编辑器 使用简单方便 不用花很多时间排版 能预览效果等 此外 文章还需要配图片 动图和视频等 所以需要好用的截图软件 视频录制和剪辑软件 本文介绍我自己使用的软件和工具 本人认
  • mysql 重复下单_你的项目是如何处理重复请求/并发请求的?

    你的项目是如何处理重复请求 并发请求的 对于一些用户请求 在某些情况下是可能重复发送的 如果是查询类操作并无大碍 但其中有些是涉及写入操作的 一旦重复了 可能会导致很严重的后果 例如交易的接口如果重复请求可能会重复下单 重复的场景有可能是
  • GD32,在电源电路VDD VDDA VREF+/-参考设计

    GD32 在电源电路参考设计 https bbs 21ic com icview 2568876 1 9 html 资料来源于微信公众号 life and family 更多相关资料可以关注下该公众号 对于GD32 在电源电路设计方面的一些
  • C语言中volatile关键字,简单说明

    C语言中volatile关键字 如 define GPIO1 DR volatile unsigned int 0x0209C000 数据寄存器 每一位代表一个GPIO的0或1 一句话 使用volatile修饰后 会强制你每次引用GPIO寄
  • epoll移植到windows的可行性研究

    1 各有千秋 linux作为高效稳定的操作系统 部署在大量的服务器上 epoll在linux下 一个高性能的网络IO模型 在服务端领域发挥着重要的作用 但在开发效率上 windows以及visual studio系列因其良好的用户体验而更受
  • rabbitmq 添加用户和设置最大权限,也是解决mq报socket关闭异常

    此方式也是解决整合mq后 自己添加用户后 mq报socket关闭异常 1 安装完可视化mq后台后 直接http localhost 15672 进入 2 默认帐号密码 guest guest 3 首先添加用户 tags设置为admin 最大
  • OpenGL纹理贴图相关基本概念

    1 纹理贴图之所以复杂是因为矩形的纹理数据需要被合理地映射到非矩形的区域上面 纹理就是数据的数组 例如颜色数据亮度数据alpha数据等 纹理的单个数据值 被叫做纹理元素 英文叫做texual 初学者会本能地把纹理当成二维图像 但是纹理也可以
  • JavaScript的外部引入方式

    document writeln hello world
  • 聊聊数据库中的 savepoint

    从全局二级索引讲起 故事要从全局二级索引开始讲起 当我们构建了一个全局二级索引之后 一条逻辑上的数据插入 就会变成两条物理上的数据插入 一条插入到主表 另一条插入到索引表 为了保证主表和索引表数据的一致性 我们往往需要开启分布式事务 再并行