首页 文章 精选 留言 我的

精选列表

搜索[智能问数],共10000篇文章
优秀的个人博客,低调大师

问 MySQL 非唯一索引等值查询加什么锁?

可重复读、读已提交两种隔离级别下,非唯一索引的等值查询会加什么锁?为什么这么加锁? > 作者:操盛春,爱可生技术专家,公众号『一树一溪』作者,专注于研究 MySQL 和 OceanBase 源码。 > 爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。 > 本文基于 MySQL 8.0.32 源码,存储引擎为 InnoDB。 1. 准备工作 创建测试表: CREATE TABLE `t2` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `i1` int DEFAULT '0', `i2` int DEFAULT '0', PRIMARY KEY (`id`) USING BTREE, KEY `idx_i1` (`i1`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; 插入测试数据: INSERT INTO `t2` (`id`, `i1`, `i2`) VALUES (1, 11, 21), (2, 12, 22),(3, 13, 23), (4, 14, 24),(5, 15, 25),(6, 16, 26); 2. 可重复读 把事务隔离级别设置为 REPEATABLE-READ(如已设置,忽略此步骤): SET transaction_isolation = 'REPEATABLE-READ'; -- 确认设置成功 SHOW VARIABLES like 'transaction_isolation'; +-----------------------+-----------------+ | Variable_name | Value | +-----------------------+-----------------+ | transaction_isolation | REPEATABLE-READ | +-----------------------+-----------------+ 执行以下 select 语句: begin; select * from t2 where i1 = 13 for share; 查看加锁情况: select engine_transaction_id, object_name, index_name, lock_type, lock_mode, lock_status, lock_data from performance_schema.data_locks where object_name = 't2' and lock_type = 'RECORD'\G ***************************[ 1. row ]*************************** engine_transaction_id | 281479856983976 object_name | t2 index_name | idx_i1 lock_type | RECORD lock_mode | S lock_status | GRANTED lock_data | 13, 3 ***************************[ 2. row ]*************************** engine_transaction_id | 281479856983976 object_name | t2 index_name | PRIMARY lock_type | RECORD lock_mode | S,REC_NOT_GAP lock_status | GRANTED lock_data | 3 ***************************[ 3. row ]*************************** engine_transaction_id | 281479856983976 object_name | t2 index_name | idx_i1 lock_type | RECORD lock_mode | S,GAP lock_status | GRANTED lock_data | 14, 4 lock_data = 13,3、lock_mode = S 表示对二级索引 idx_i1 中 <i1 = 13, id="3"> 的记录加了共享 Next-Key 锁。 lock_data = 3、lock_mode = S,REC_NOT_GAP 表示对主键索引中 <id = 3> 的记录加了共享普通记录锁。 lock_data = 14,4、lock_mode = S,GAP 表示对二级索引 idx_i1 中 <i1 = 14, id="4"> 的记录加了共享间隙锁。 大家对这样的加锁情况是否有疑问呢? 如果你也有疑问,就让我们一起来看看 InnoDB 为什么会这样加锁吧。 可重复读隔离级别下: 对于 select 语句中 where 条件覆盖范围内的记录,默认加共享 Next-Key 锁。 对于 update、delete 语句中 where 条件覆盖范围内的记录,默认加排他 Next-Key 锁。 示例 SQL 对二级索引 idx_i1 中 <i1 = 13, id="3"> 的记录加了共享 Next-Key 锁,这属于默认行为,不多解释。 示例 SQL 执行过程中,从二级索引 idx_i1 中读取 <id = 13, id="3"> 的记录之后,需要根据其中的主键字段 <id = 13> 回表查询主键记录。 主键索引字段等值查询,读取记录之后,只需要对这条记录加普通记录锁,防止其它事务修改或者删除这条记录,就能保证可重复读。 这就是示例 SQL 对主键索引中 <id = 3> 的记录加共享普通记录锁的原因。 InnoDB 从二级索引 idx_i1 中读取 <i1 = 13, id="3"> 的记录之后,再回表找到主键索引中 <id = 3> 的记录,返回给 server 层。 where 条件命中的二级索引 idx_i1 是非唯一索引,server 层不能确定刚刚读取到的就是满足 where 条件的最后一条记录,所以会要求 InnoDB 继续读取下一条记录。 InnoDB 从二级索引 idx_i1 中读取下一条记录,得到 <i1 = 14, id="4"> 的记录,发现这条记录不匹配 server 层下推到 InnoDB 的 where 条件(i1 = 13),不需要锁定这条记录。 为了保证可重复读,要防止其它事务往 <i1 = 14, id="4"> 这条记录前面的间隙插入 <i1 = 13> 的记录,InnoDB 需要锁定这条记录前面的间隙,所以,对二级索引 idx_i1 中 <i1 = 14, id="4"> 的记录加共享间隙锁。 InnoDB 已经根据下推条件判断出 <i1 = 14, id="4"> 的记录不匹配 where 条件,不需要回表读取主键索引记录,也就不会对主键索引中 <id = 4> 的记录加锁了。 3. 读已提交 把事务隔离级别设置为 READ-COMMITTED(如已设置,忽略此步骤): SET transaction_isolation = 'READ-COMMITTED'; -- 确认设置成功 SHOW VARIABLES like 'transaction_isolation'; +-----------------------+----------------+ | Variable_name | Value | +-----------------------+----------------+ | transaction_isolation | READ-COMMITTED | +-----------------------+----------------+ 执行以下 select 语句: begin; select * from t2 where i1 = 13 for share; 查看加锁情况: select engine_transaction_id, object_name, index_name, lock_type, lock_mode, lock_status, lock_data from performance_schema.data_locks where object_name = 't2' and lock_type = 'RECORD'\G ***************************[ 1. row ]*************************** engine_transaction_id | 281479856983976 object_name | t2 index_name | idx_i1 lock_type | RECORD lock_mode | S,REC_NOT_GAP lock_status | GRANTED lock_data | 13, 3 ***************************[ 2. row ]*************************** engine_transaction_id | 281479856983976 object_name | t2 index_name | PRIMARY lock_type | RECORD lock_mode | S,REC_NOT_GAP lock_status | GRANTED lock_data | 3 lock_data = 13,3、lock_mode = S,REC_NOT_GAP 表示对二级索引 idx_i1 中 <i1 = 13, id="3"> 的记录加了共享普通记录锁。 lock_data = 3、lock_mode = S,REC_NOT_GAP 表示对主键索引中 <id = 3> 的记录加了共享普通记录锁。 读已提交隔离级别下: 对于 select 语句中 where 条件覆盖范围内的记录,默认加共享普通记录锁。 对于 update、delete 语句中 where 条件覆盖范围内的记录,默认加排他普通记录锁。 示例 SQL 对二级索引 idx_i1 中 <i1 = 13, id="3"> 的记录加共享普通记录锁,属于默认行为,不多解释。 示例 SQL 从二级索引 idx_i1 中读取 <i1 = 13, id="3"> 的记录之后,根据主键字段值回表查询主键索引记录,因为读已提交隔离级别不需要保证可重复读,只需要防止其它事务修改或者删除主键索引中 <id = 3> 的记录,加共享普通记录锁就可以了。 回表读取到主键索引中 <id = 3> 的记录之后,InnoDB 会把记录返回给 server 层。 where 条件命中的二级索引 idx_i1 是非唯一索引,server 层不能确定刚刚读取到的就是满足 where 条件的最后一条记录,所以会要求 InnoDB 继续读取下一条记录。 InnoDB 从二级索引 idx_i1 中读取下一条记录,得到 <i1 = 14, id="4"> 的记录,发现这条记录不匹配 server 层下推到 InnoDB 的 where 条件(i1 = 13),不需要锁定这条记录。 读已提交隔离级别不需要保证可重复读,也就不需要对二级索引 idx_i1 中 <i1 = 14, id="4"> 的记录前面的间隙加共享间隙锁了。 4. 总结 没有需要总结的内容。 更多技术文章,请访问:https://opensource.actionsky.com/ 关于 SQLE SQLE 是一款全方位的 SQL 质量管理平台,覆盖开发至生产环境的 SQL 审核和管理。支持主流的开源、商业、国产数据库,为开发和运维提供流程自动化能力,提升上线效率,提高数据质量。 ✨ Github:https://github.com/actiontech/sqle 📚 文档:https://actiontech.github.io/sqle-docs/ 💻 官网:https://opensource.actionsky.com/sqle/ 👥 微信群:请添加小助手加入 ActionOpenSource 🔗 商业支持:https://www.actionsky.com/sqle</i1></i1></id></id></i1></i1></id></i1></id></i1></i1></i1></i1></i1></id></i1></id></id></id></i1></i1></id></i1>

优秀的个人博客,低调大师

三问三答:细数GaussDB迁移的核心技术

摘要:本文从客户视角的三个疑问出发,一起了解华为云GaussDB数据库的迁移解决方案具有哪些核心技术,如何做到让客户迁移过程安心、放心、省心。 迁移是数据库选型过程中客户最为关心的话题之一,经过大量的沟通调研,我们总结客户在数据库迁移方面的主要期望:迁移不影响业务运行(安心)、迁移不能丢数据(放心)、迁移实施起来简单(省心)。 本文从客户视角的三个疑问出发,一起了解华为云GaussDB数据库的迁移解决方案具有哪些核心技术,如何做到让客户迁移过程安心、放心、省心。 问题1:能不能搬? 每种数据库都有自己的一些特定的“脾气”,比如Oracle的语言直接在GaussDB上运行不一定能工作,这个就是所谓的“语言不通”,这种场景称之为“异构数据库的迁移”,“语言不通”是长期以来异构数据库迁移替换的最大技术障碍。下面我们从技术和效果两方面来看。 技术方面,华为是怎么解决的? 华为的迁移套件中有一款叫UGO的工具,它像“翻译大师一样”,把这个难题分成两部分来看: 第一部分读懂Oracle语言:Oracle的语法对应一个个巨大的树形结构,并由一些关键元素构成,比如一条Oracle建表语句,表名是什么,有几列,每列的名字是什么等等。UGO具有专属的语法分析器,能够顺着语法树和枚举探测出每条Oracle的语句元素构成,这样最终理解了语义,读懂了Oracle语言。 第二部分根据知识库“翻译”成GaussDB的写法:根据刚才的描述,这个技术很像是做“翻译”工作,生活经验告诉我们,翻译的水平高低取决于接触的训练场景和词汇样本是否足够大,华为UGO依靠流程IT和工商银行这两个世界上最复杂的Oracle业务环境训练,截止到现在,已经向UGO注入了几千万行级的代码训练量,这个是业界公布的最高纪录,同类产品没有这方面的相关介绍。 那效果究竟如何? “翻译大师”UGO依托华为独有的训练场景,接入Oracle后,通常几分钟可以生成一份详细的评估报告,让迁移至GaussDB的可行性一目了然。在工行迁移攻坚战的最高挑战场景,千万级的存储过程迁移中,经过UGO的处理,Oracle 95%代码转化后可以在GaussDB直接运行,去O已经非常接近自动化。 问题2:怎么迁移让业务无感知? 数据库一个非常繁忙的软件,每一秒过去可能成千上万的数据发生了变化,如何在数据高度变化的动态过程中将数据库迁走,比较容易想到的做法是将业务停机来确保数据迁移不丢失,但这对于一个核心业务来说是无法接受的,这样就提出了一个技术问题,有没有一种办法可以在业务运行过程中将数据库迁移到GaussDB,也就是业界常说的热迁移,或者说在线迁移。 技术方面,华为的迁移套件中有一款叫DRS的工具,它像“数据的复制机”一样,能够做到Oracle运行过程中迁移到GaussDB。DRS工具从技术上将这个问题分为了三部分: 第一部分存量数据搬迁,DRS采用行级并行方式抽取数据,抽取性能最大可达100+MB/s,同时客户可以在源端资源允许情况下设置迁移速度,做到按照想要的速度迁移,想快就快,想慢就慢; 第二部分增量数据搬迁,数据库有一个组件叫日志,它用快速而有序的方式记录了数据库中每一个数据的变化,是数据库停电不丢数据的关键技术,DRS采用技术手段可以将日志记录的事情重演一遍,这个过程就好像将Oracle数据变化录制下来,将同样的操作再在GaussDB上操作一遍,这个技术业界一般称为CDC技术(change data capture),不仅如此,DRS还采用了技术手段将一条条数据的操作优化为并行运行,让两边数据既能确保不丢失,又能大大提升同步速度,通常Oracle数据库新产生的数据在1s内就可以在GaussDB看到,即使是一个非常庞大繁忙的Oracle系统(比如一天日志量达到TB级别)也能做到秒级同步。 第三部分动态数据对比,DRS内置了一套专利算法,每隔x分钟(可配置)识别增量日志中变化的数据行,并根据数据行的主键值,查询和对比源库和目标库的数据,从而阶段性验证Oracle和GaussDB的数据一致性,如此循环操作,持续刷新一致性比对结果,得到最终一致性结论。而不用停止Oracle数据库的业务接入,进行长时间的数据校对。 效果如何? “数据的复制机”DRS通过CDC技术实现在线迁移,做到Oracle在运行过程中将数据迁移至GaussDB,数据可对比零丢失,业务可自由选择割接时间,并且搬迁过程中业务无感。总结下来就是,业务无感->安心,数据不丢失->放心,自动化数据同步->省心; 问题3:怎么确保迁移后业务稳定运行? 上面解答了能不能迁移,怎么迁移的问题,那么迁移至GaussDB后能否平稳度过业务峰值的考验,技术上有了上面UGO和DRS的基础,我们能够在Oracle数据库上自动采集数据了。业务上的一个个请求是从应用程序发送至Oracle数据库的,里面有查询请求,也有数据修改请求,这些请求的总和就是业务流量了,业务高峰期采集到业务流量后通过UGO进行语法转化,结合通过DRS构建的真实生产环境数据,这样可以形成了基于GaussDB数据库的业务仿真压测环境。 通过仿真压测,客户可以直接预测GaussDB能否稳定度过业务洪峰,并提前识别是否需要做规格的调整,对于业务本身,也支持细粒度切换的迁移,DRS可以让数据进行双向传输,可并线逐步切流,观察GaussDB的业务承载能力,具备随时可回退能力。 最后,再总结一下华为GaussDB的全套迁移方案, “翻译大师”UGO解决语言不通语法转化的问题,“数据的复制机”DRS解决业务不停机数据迁移的问题,同时DRS工具还提供仿真压测、数据一致性对比等配套能力。通过这些能力华为在金融各大行项目中已经大量落地,同时华为云数据库迁移解决方案是信通院数据库迁移评测中首个获得最高级迁移能力的厂商,华为云GaussDB数据库致力于通过技术,给客户提供一套安心、放心、省心的迁移解决方案。 点击关注,第一时间了解华为云新鲜技术~

优秀的个人博客,低调大师

诚心求问:做一个 Serverless SSR 需要几步?

很久之前,看到过一个段子:“把大象塞进冰箱需要几步?” 回答是:“三步,第一步打开冰箱,第二步把大象塞进去,第三步关上冰箱”。这是一个无厘头式的幽默,用极简平淡的回答,来解释看似夸张的问题。 做一个 Serverless SSR 虽然不是把大象装进冰箱这样的问题,但是同样让很多开发者望而生畏 —— 因为网上关于 SSR 和 Serverless 的教程太多,动辄很大篇幅,很多步骤。让初学者无从下手,就算照着学一遍,也可能会遇到这样那样的问题,很费功夫。 但是现在,开发者可以有一种 “冰箱装大象” 的方式来完成一个 Serverless SSR: 你需要有一个 SSR 框架 :Next.js 你需要有一个 Serverless 框架 :Serverless Framework 然后,只要将你的 SSR 框架一步装入 Serverless Framework! 跟着我一起做吧,几分钟完成一个 Serverless SSR 的模式: 首先,你需要有一个 SSR 框架,下面我们创建并初始化一个 Next.js 项目。 我们在本地创建一个 Next.js 项目并初始化: $ mkdir serverless-next && cd serverless-next $ npm init next-app src 然后,你需要有一个 Serverless 框架,下面的代码将通过 npm 全局安装 serverless cli $ npm install -g serverless 在项目根目录创建serverless.yml 文件: $ touch serverless.yml 在其中进行如下配置: component: nextjs # (必填) 组件名称,此处为nextjs name: nextjsDemo # (必填) 实例名称 org: orgDemo # (可选) 用于记录组织信息,默认值为您的腾讯云账户 appid app: appDemo # (可选) 该 next.js 应用名称 stage: dev # (可选) 用于区分环境信息,默认值是 dev inputs: src: ./src functionName: nextjsDemo region: ap-guangzhou runtime: Nodejs10.15 exclude: - .env apigatewayConf: protocols: - http - https environment: release 更多配置说明:https://github.com/serverless-components/tencent-nextjs/blob/v2/docs/configure.md 最后,将你的 SSR 框架装入 Serverless 框架,并部署 $ npm run build 在 serverless.yml 文件下的目录中运行以下指令进行部署: $ sls deploy 执行部署完成后,扫描二维码授权登录腾讯云 部署成功后,命令行会输出 Next.js 的部署地址(见红框)。将其复制到浏览器中打开,我们会看到 Next.js 的欢迎页面。到这里,你就成功部署了 Serverless SSR! 查看和管理你的 SSR 项目 刚才的步骤,我们完成了 Next.js 框架的 Serverless 方式部署。那么,如何查看和管理刚才部署的 Next.js 项目呢? 腾讯云 Serverless 提供了一站式的 Dashboard,可以方便地对项目进行可视化的管理和后续操作。访问地址:https://serverless.cloud.tencent.com 可以看到,我们刚才部署的 Next.js 项目,已经出现在 Dashboard 中了。点击该项目,即可查看到该项目的详细信息,并进行后续的操作。 以上,就是使用 Serverless Framework 轻松部署 SSR 框架 Next.js 的全部过程。不仅是 Next.js,包括 Express、Koa、Egg、Nuxt 等 Node 框架,都可以用同样的方法轻松完成部署。 Serverless Framework 30 天试用计划 我们诚邀您来体验最便捷的 Serverless 开发和部署方式。在试用期内,相关联的产品及服务均提供免费资源和专业的技术支持,帮助您的业务快速、便捷地实现 Serverless! 详情可查阅:Serverless Framework 试用计划 One More Thing 3 秒你能做什么?喝一口水,看一封邮件,还是 —— 部署一个完整的 Serverless 应用? 复制链接至 PC 浏览器访问:https://serverless.cloud.tencent.com/deploy/express 3 秒极速部署,立即体验史上最快的 Serverless HTTP 实战开发! 传送门: GitHub: github.com/serverless 官网:serverless.com 欢迎访问:Serverless 中文网,您可以在 最佳实践 里体验更多关于 Serverless 应用的开发! 推荐阅读:《Serverless 架构:从原理、设计到项目实战》

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册