MySQL更新一条已经存在的sql语句是怎么执行的

news2024/11/17 3:41:09

MySQL更新一条已经存在的sql语句是怎么执行的

  • 1. 问题描述
  • 2. 分析验证

1. 问题描述

今天看到一个有意思的问题,就是Mysql更新一条已经存在的语句是怎么执行的,结果显示,匹配(rows matched)了一行,修改(Changed)了0行。,实际上执行完成sql会提示Affected rows: 0,是的,你没看错更新0行,那这就有意思了,mysql到底是更新了没有呢,具体是在哪一层更新的呢?根据之前写的文章《MySQL是如何执行一条SQL更新语句》知道更新sql语句是在server层先读取原来值,然后调用数据库引擎,最后由数据库引擎执行完成返回给server层,根据以上分析有三种情况。

仅从现象上看,MySQL内部在处理这个命令的时候,可以有以下三种选择:
1.更新都是先读后写的,MySQL读出数据,发现a的值本来就是2,不更新,直接返回,执行结束。
2.MySQL调用了InnoDB引擎提供的“修改为(1,2)”这个接口,但是引擎发现值与原来相同,不更新,直接返回;
3.InnoDB认真执行了"把这个值修改成(1,2)"这个操作,该加锁的加锁,该更新的更新。

2. 分析验证

1.首先关闭Navicat自动提交事务
关闭Navicat自动提交:菜单栏-》工具-》选项-》选中,自动开始事务

2.创建表

-- -测试update
create table demo(
id int(11) not null primary key auto_increment,
a int(11) default null
)engine=InnoDB;

-- 插入1,2
insert into demo values(1,2);
-- 查看插入是否成功
select * from demo;

3.每种情况分析
第一个选项是,MySQL读出数据,发现值与原来相同,不更新,直接返回,执行结束。这里我们可以用一个锁实验来确认。
在这里插入图片描述
Navicat开启两个窗口,sessionA不提交,sessionB阻塞住,等sessionA commit后,sessionB执行成功。session B的update 语句被blocked了,加锁这个动作是InnoDB才能做的,所以排除选项1。

第二个选项是,MySQL调用了InnoDB引擎提供的接口,但是引擎发现值与原来相同,不更新,直接返回。有没有这种可能呢?这里我用一个可见性实验来确认。
在这里插入图片描述session A的第二个select 语句是一致性读(快照读),它是不能看见session B的更新的。
现在它返回的是(1,3),表示它看见了某个新的版本,这个版本只能是session A自己的update语句做更新的时候生成。

所以,答案应该是选项3,即:InnoDB认真执行了“把这个值修改成(1,2)"这个操作,该加锁的加锁,该更新的更新。

然后你会说,MySQL怎么这么笨,就不会更新前判断一下值是不是相同吗?如果判断一下,不就不用浪费InnoDB操作,多去更新一次了?
其实MySQL是确认了的。只是在这个语句里面,MySQL认为读出来的值,只有一个确定的(id=1), 而要写的是(a=3),只从这两个信息是看不出来“不需要修改”的。作为验证,可以执行下面的例子
在这里插入图片描述执行sql(注意关闭自动提交,开启两个不同的事务,按照顺序执行)

-- sessionA
begin;
-- 1,2
select * from demo;

-- sessionB
update demo set a=3 where id =1;
-- 1,3
select * from demo;
commit;

-- sessionA
update demo set a=3 where id =1 and a=3;
-- 1,2
select * from demo where id =1;
commit;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/60981.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

sql集锦

sql集锦查询本月数据新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的Ka…

《MongoDB》Mongo Shell中的基本操作-更新操作一览

前端博主,热衷各种前端向的骚操作,经常想到哪就写到哪,如果有感兴趣的技术和前端效果可以留言~博主看到后会去代替大家踩坑的~ 主页: oliver尹的主页 格言: 跌倒了爬起来就好~ 来个关注吧,点个赞…

“剧情+综艺” 助推国潮文化破圈

一舞千年,重现大唐辉煌;一曲流光,雕琢岁月模样;一纸云烟,漫卷诗书山河;跨历史长河,览盛世华章。自从河南卫视开启“剧情综艺”的晚会形式,晚会便多了一种呈现方式。 从2021年《唐宫夜…

本周XR新闻:吴德周成立AR硬件公司,SideQuest支持PICO、Magic Leap

本周AR/VR大新闻,AR方面:吴德周成立AR硬件公司“致敬未知科技”;彭博称苹果AR操作系统或命名“xrOS”;AR眼镜开源方案OpenAR亮相;Epic 3D扫描工具RealityScan上线;Qoncept推出基于AI的实时姿态追踪系统。 …

Docker_实用篇_Docker-Compose_微服务部署

Docker_实用篇_Docker-Compose_微服务部署 文章目录Docker_实用篇_Docker-Compose_微服务部署4.1Docker-Compose4.2.初识DockerCompose4.3.部署微服务集群4.3.1.打包前文件汇总4.3.2.修改微服务配置4.3.3.打包4.3.4.拷贝jar包到部署目录4.3.5.部署4.1Docker-Compose Docker Co…

Vue(第十六课)JSON-SERVE和POSTMAN技术中对数据的增删改查

今天来聊聊axios技术 同样将官网地址放在博客里: 邮递员API平台|免费注册 (postman.com) json-server - npm (npmjs.com) 起步 | A jsxios 中文文档 | Axios 中文网 (axios-http.cn) 了解一下概念: 1 Axios Axios 是一个基于 promise 网络请求库,作用于node.js …

五、伊森商城 前端基础-Vue p24

目录 1、v-on 2、事件修饰符 3、按键修饰符 3.1、组合按钮 4、v-for 5、v-if和v-show 6、v-else 和 v-else-if 6.1、v-if结合v-for来时用 1、v-on v-on 指令用于给页面元素绑定事件。 语法: v-on:事件名"js 片段或函数名"事件绑定可以简写&#xff…

[附源码]计算机毕业设计基于JEE平台springboot技术的订餐系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

Dcoker入门,小白也学得懂!

目录 一、Dcoker简介 二、Centos7安装Docker 三、Docker 容器运行原理解析 四、阿里云镜像仓库配置 一、Dcoker简介 1.1简单介绍 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个…

【Java难点攻克】「海量数据计算系列」如何使用BitMap在海量数据中对相应的进行去重、查找和排序实战

BitMap(位图)的介绍 BitMap从字面的意思,很多人认为是位图,其实准确的来说,翻译成基于位的映射,其中数据库中有一种索引就叫做位图索引。 在具有性能优化的数据结构中,大家使用最多的就是hash…

LiteOS-M内核

简介 OpenHarmony LiteOS-M内核是面向IoT领域构建的轻量级物联网操作系统内核,具有小体积、低功耗、高性能的特点,其代码结构简单,主要包括内核最小功能集、内核抽象层、可选组件以及工程目录等,分为硬件相关层以及硬件无关层&…

[附源码]计算机毕业设计校园快递柜存取件系统Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

多线程复习——进程线程(上)

目录 一、进程是啥?跑起来的程序 二、进程是怎么管理的?描述组织 三、进程的PCB里有啥? 四、进程的调度是咋进行?时间管理大师 五、进程的独立性是咋回事? 六、进程之间如何通信? 一、进程是啥?跑起来的程序 进程(process) 也叫做 任务(task).对于操作系统来说 一个…

牛客网刷题(BC72、BC18、BC83、BC84、BC41、BC31、BC17、BC6)

目录 一、BC72 平均身高 二、BC18 计算带余除法​编辑 三、BC83 被5整除问题​编辑 四、BC84计算y的值 五、BC41 你是天才吗? 六、BC31 发布信息 七、BC17 计算表达式的值 八、BC6 小飞机 **太简单的题就没有文字叙述了~ 一、BC72 平均身高 #define _CRT_S…

[附源码]Python计算机毕业设计Django人体健康管理app

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

力扣(LeetCode)134. 加油站(C++)

贪心 考虑暴力,枚举所有点作为起点,每个点先加油,再尝试前往下一个点,剩余油量大于等于 000 ,就可以走下去。枚举所有点的所有路径,时间复杂度 O(n2)O(n^2)O(n2) ,对于本题规模 TLETLETLE 。 …

Redis常见错误

目录 一、(error) NOAUTH Authentication required. 二、(error) ERR unknown command keys* 三、(error) ERR invalid password 一、(error) NOAUTH Authentication required. 错误原因:没有使用密码登录认证 使用命令: auth 你自己的密码 如果密码…

【人工智能】确定型推理

确定性推理(Deterministic Reasoning)目录一、推理基本概念二、推理逻辑基础1. 命题逻辑(Propositional Logic)2. 谓词逻辑(Predicate Logic)3. 推理的控制策略(i) 推理方向(a) 正向推理:已知事…

[附源码]Python计算机毕业设计SSM教务一点通管理系统(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

制作一个简单HTML个人网页网页——人物介绍梵高(HTML+CSS)

🎉精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…