展开菜单
首页 精品内容 本月促销 装机必备 Windows PDF教程 macOS软件 IOS软件 Android AI 专题
全部分类

当前位置:

首页 > 编程开发 > MySQL的表级锁,行级锁,排它锁和共享锁是什么

MySQL的表级锁,行级锁,排它锁和共享锁是什么

前言先说下事务是什么,因为我们业务是比较复杂的,不可能一个sql就能解决的,涉及多个sql就组成一个事务。事务就是一组sql共同执行,要么完全成功,要么完全失败,不能出现部分成功或者部分失败的情况。一个事务有ACID特性:原子性:要么全部成功,要么全部失败,这样才能保证事务的一致性;一致性:比如银行的转账,扣除一个人的钱肯定要给另一个人加钱,不能光扣除不加,这样业务就存在问题,数据的一致性就破坏了;持久性:当我们数据commit以后,数据是先写到缓存当中,缓存中的数据还是要慢慢花时间往磁盘上写,如果此时停

本文目录

      前言

      先说下事务是什么,因为我们业务是比较复杂的,不可能一个sql就能解决的,涉及多个sql就组成一个事务。事务就是一组sql共同执行,要么完全成功,要么完全失败,不能出现部分成功或者部分失败的情况。一个事务有ACID特性:

      • 原子性:要么全部成功,要么全部失败,这样才能保证事务的一致性;

      • 一致性:比如银行的转账,扣除一个人的钱肯定要给另一个人加钱,不能光扣除不加,这样业务就存在问题,数据的一致性就破坏了;

      • 持久性:当我们数据commit以后,数据是先写到缓存当中,缓存中的数据还是要慢慢花时间往磁盘上写,如果此时停电了、宕机或者重启了,我们有redo log重做日志来保证数据库的持久性;

      • 隔离性:这块可以说下事务为什么要有隔离性,因为事务要允许并发执行,一个业务涉及了很多事务,而我们后台往往有很多业务,要能够让他们并发执行,如果所有的事务都是串行执行的话,那这样我们写多线程程序只有一个线程来做事情,这样效率很低。所以事务要并发执行,但是并发执行涉及了一些问题:事务的安全性&一致性和并发的效率问题,我们以这两个东西为参考点,才得到了MySQL不同等级的并发/隔离,如果事务并发执行时我们完全不隔离的话,就可能会出现脏读(事务B读到了事务A还未提交的数据然后,然后用事务A未提交的数据去做计算,得到了很多其他的结果,然后事务A又把那个数据rollback掉,那么事务B计算出来的都是有问题的数据,脏读一定会出现问题)、不可重复读(以同样的条件去一个数据,然后再次去查询的时候发现数据的值有所改变,当然不可重复读也不一定会有问题,有些业务场景下是允许的,这和业务上数据的安全性和一致性是否严格有关)和幻读(在事务中按照同样的条件前后两次查询的结果数据量不同)这些问题。

      那么我们为了解决事务并发执行遇到的问题就给出了事务的隔离级别:

      • 串行化,串行化完全用锁来实现,通过锁给所有事务排序,按顺序执行,这样做数据的安全性高但并发的效率很低,一般我们不会这样做的。

      • 未提交读,对于我们写的多线程程序来说,对于临界区代码段没有做任何的并发控制,虽然并发性高但数据安全性很低,未提交读还允许脏读的存在,这是有问题的所以绝对不会使用未提交读。串行化和未提交读在实际项目中是不会用到的,一般数据库引擎默认工作在已提交读和可重复读,这两个隔离级别就结合了数据的安全性&一致性和数据的并发效率,这两个是由MVCC多版本并发控制机制实现的。

      • 已提交读,oracle默认工作级别。不允许读取未commit的数据,这个级别仍然允许不可重复读和虚读产生。

      • 可重复读,MySQL默认工作级别。保证事务再次读取是依然得到相同的数据,部分解决了虚读,但虚读是仍然会出现的

      MySQL的表级锁,行级锁,排它锁和共享锁是什么

      MySQL的表级锁,行级锁,排它锁和共享锁是什么

      注意:

      • 事务隔离级别越高,为避免冲突所花费的性能也就越多,即效率低。

      • 在“可重复读”级别,实际上可以解决部分的虚读问题,但是不能防止update更新产生的虚读问题,要禁止虚读产生,还是需要设置串行化隔离级别。

      事务隔离级别的实现原理:锁+MVCC。串行化底层实现原理是锁,锁有共享锁、排它锁、意向共享锁、意向排它锁、间隙锁和死锁,InnoDB的已提交读和可重复读的底层实现原理:MVCC(多版本并发控制),MVCC提供了一种并发读取方式,包括快照读(同一份数据会有多个版本)、当前读、undo log和redo log。MVCC是已提交读和可重复读的原理,锁是串行化的原理

      MySQL的表级锁,行级锁,排它锁和共享锁是什么

      ACD特性用事务日志实现,I 特性用共享锁、排它锁、MVCC 实现。事务日志分为undo log(回滚日志) 和 redo log(重做日志)

      一、表级锁&行级锁

      • 表级锁:对整张表加锁。开销小(因为不用去找表的某一行的记录进行加锁,要修改这张表,直接申请加这张表的锁),加锁快,不会出

      • 现死锁;锁粒度大,发生锁冲突的概率高,并发度低

      • 行级锁:对某行记录加锁。开销大(需要找到表中相应的记录,有搜表搜索引的过程),加锁慢,会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度高

      MySQL的表级锁,行级锁,排它锁和共享锁是什么

      MyISAM存储引擎只支持表级锁,InnoDB支持事务处理,支持行级锁,并发能力更好

      MySQL的表级锁,行级锁,排它锁和共享锁是什么

      二、排它锁&共享锁

      • 排它锁:又称为X锁,写锁

      • 共享锁:又称为S锁,读锁

      读读(SS)之间是可以兼容的,但是读写(SX、SX)之间,写写(XX)之间是互斥的

      MySQL的表级锁,行级锁,排它锁和共享锁是什么

      1. 测试不同事务之间排它锁和共享锁的兼容性

      我们先查看表SQL及内容

      MySQL的表级锁,行级锁,排它锁和共享锁是什么

      查看隔离级别:

      MySQL的表级锁,行级锁,排它锁和共享锁是什么

      首先开启一个事务A,给id=7的数据加上排它锁:

      MySQL的表级锁,行级锁,排它锁和共享锁是什么

      在另一个客户端开启事务B:

      MySQL的表级锁,行级锁,排它锁和共享锁是什么

      MySQL的表级锁,行级锁,排它锁和共享锁是什么

      给id=7不管加排它锁和共享锁都阻塞了并没有查询出来,因为A事务给id=7这一行的数据加了排它锁,就是写锁,其他人不能读也不能写。

      总结:不同事务之间对于数据的锁,只有SS锁可以共存,XX、SX、XS都不能共存

      2. 测试行锁加在索引项上

      其实行锁是加在索引树上的。

      MySQL的表级锁,行级锁,排它锁和共享锁是什么

      每次做完测试都把刚做的rollback。

      用表的无索引字段作为过滤条件

      MySQL的表级锁,行级锁,排它锁和共享锁是什么

      那现在事务2获取不同行chenwei的记录

      MySQL的表级锁,行级锁,排它锁和共享锁是什么

      InnoDB是支持行锁的,刚才以主键id为过滤条件时,事务1和事务2获取不同行的锁是可以成功的。然而现在我们发现获取name为chenwei的排它锁也获取不到了,这是为什么?我们解释一下:

      InnoDB的行锁是通过给索引项加锁来实现的,而不是给表的行记录加锁实现的

      而我们用name作为过滤条件没有用到索引,自然就不会使用行锁,而是使用表锁。这就意味着只有通过索引检索数据,InnoDB才使用行级锁,否则InnoDB都将使用表锁!!!

      我们给name字段加上索引:

      MySQL的表级锁,行级锁,排它锁和共享锁是什么

      然后再做刚才的操作:

      MySQL的表级锁,行级锁,排它锁和共享锁是什么

      我们发现,给name加上索引后,两个事务可以获取到不同行的排它锁(for update),再一次证明了InnoDB的行锁是加在索引项上的。

      MySQL的表级锁,行级锁,排它锁和共享锁是什么

      因为现在name走的是索引, 通过zhangsan在辅助索引树上找到它所在行记录的id是7,然后到主键索引树上,获取对应行记录的排他锁(个人猜测应该是辅助索引树和主键索引树相应的记录都加了锁)

      三、串行化隔离级别测试

      串行化所有事务用的都是共享锁或者排它锁,不需用手动添加。select获取的是共享锁,insert、delete和update获取的都是排它锁。

      设置串行化隔离级别:

      MySQL的表级锁,行级锁,排它锁和共享锁是什么

      两个事务可以同时获取共享锁(SS共存:

      MySQL的表级锁,行级锁,排它锁和共享锁是什么

      现在让事务2插入数据;

      MySQL的表级锁,行级锁,排它锁和共享锁是什么

      由于Insert需要加排它锁,但是由于事务1已经对整张表加了共享锁,事务2无法再对表成功加锁(sx不共存)

      rollback一下,把所有获取锁的状态都回退掉:

      MySQL的表级锁,行级锁,排它锁和共享锁是什么

      开启两个事务:

      MySQL的表级锁,行级锁,排它锁和共享锁是什么

      因为我们给name加上了索引,以上的select相当于给name为zhangsan的数据加上了行共享锁

      事务2update;

      MySQL的表级锁,行级锁,排它锁和共享锁是什么

      事务2不能update,因为此时已经被事务1的共享锁锁住了整个表

      事务2在辅助索引树上找zhangsan,找到对应的主键值,然后去主键索引树找到相应的记录,但是发现这行记录已经被共享锁锁住了,事务2可以获取共享锁,但是不能获取排他锁

      MySQL的表级锁,行级锁,排它锁和共享锁是什么

      我们再用主键索引试试id能不能update

      MySQL的表级锁,行级锁,排它锁和共享锁是什么

      依然阻塞住了,虽然我们where后面的字段现在使用的id而不是name,但是name也是通过辅助索引树找到对应的主键,再到主键索引树上找相应的记录,而主键索引树上的记录加了锁

      我们update id=8的数据,成功了。因为我们select的时候,只是给id=7的数据加上了行锁,我们操作id=8的数据当然可以成功

      MySQL的表级锁,行级锁,排它锁和共享锁是什么

      有索引,则使用行锁;没有索引,则使用表锁。

      表级锁还是行级锁说的是锁的粒度,共享锁和排他锁说的是锁的性质,不管是表锁还是行锁,都有共享锁和排他锁的区分。

      串行化玩的就是排它锁和共享锁,在可重复读级别下,不手动加锁的话,用的就是MVCC机制,实际上并没有用到锁,我们也可以手动加锁。InnoDB如果不创建索引的话,用的是表锁,如果查询的时候用到了索引项,它用的就是行锁了,行锁是给索引加锁,而不是单纯给一行数据加锁。

      本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
      作者最新文章
      编程开发 MySQL
      相关文章 更多
      精品专题 更多
      装机必备

      正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

      Windows

      正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

      PDF教程

      正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

      macOS软件

      正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

      IOS软件

      正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

      AI

      正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

      Mac软件 更多
      Aperty macOS版
      Aperty macOS版

      Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

      火山引擎 网页版
      火山引擎 网页版

      火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

      立刻MV 网页版
      立刻MV 网页版

      立刻MV 面向音乐人、内容创作者和品牌团队,帮助用户低成本完成歌曲 MV、歌词视频、AI 分镜、图生视频与最终合成。

      蛙蛙写作 网页版
      蛙蛙写作 网页版

      蛙蛙写作 AI 创作工具,覆盖小说、剧本、文案,一键生成文稿,打通文字转视频全流程,高效解决创作难题。

      讯飞智作 网页版
      讯飞智作 网页版

      讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

      超级简历WonderCV 网页版
      超级简历WonderCV 网页版

      超级简历WonderCV是面向应届生和AI小白的智能求职平台,覆盖简历、面试与职业规划。

      音述AI 网页版
      音述AI 网页版

      音述AI,是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区。

      AionClaw macOS版
      AionClaw macOS版

      AionClaw 是可在桌面端运行的任务型 AI 助手,通过数字专家与技能市场组合办公、创作、数据和开发能力。

      Loomy macOS版
      Loomy macOS版

      Loomy 是科大讯飞推出的桌面 AI 助手,可通过对话、任务与工作目录协助处理办公、内容创作和资料整理。

      AirBuddy 3 macOS版
      AirBuddy 3 macOS版

      AirBuddy 3 是面向 macOS 的蓝牙外设增强工具,可集中查看 AirPods、Beats 与苹果设备电量,提供快速连接、播放控制、电量提醒、桌面小组件和多台 Mac 外设接力等功能。

      AirServer macOS版
      AirServer macOS版

      AirServer macOS版可把 Mac 转换为无线投屏接收端,通过 AirPlay 或 Google Cast 接收手机、平板和电脑画面,并支持多设备同时连接、高清镜像及会话录制,适合家庭娱乐、课堂教学、会议演示和应用展示。

      AnyDesk macOS版
      AnyDesk macOS版

      AnyDesk macOS版是一款适用于远程办公、设备维护和客户支持的远程桌面工具,可连接并操作异地计算机,支持文件传输、无人值守访问、会话权限控制及跨平台协作。

      WINDOWS 更多
      讯飞绘文 网页版
      讯飞绘文 网页版

      讯飞绘文网页版是科大讯飞推出的AI图文创作与内容运营工具,覆盖热点选题、文章生成、稿件校对、智能配图、排版发布和数据复盘等环节,适合自媒体创作者及内容团队在线使用。

      Maya(Autodesk Maya) Windows版
      Maya(Autodesk Maya) Windows版

      Autodesk Maya 是面向影视、电视、动画和游戏行业的专业三维制作软件,集多边形与 NURBS 建模、角色绑定、关键帧和动作捕捉动画、Bifrost 特效模拟、材质开发及 Arnold 渲染于一体,

      Aperty Windows版
      Aperty Windows版

      Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

      火山引擎 网页版
      火山引擎 网页版

      火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

      立刻MV 网页版
      立刻MV 网页版

      立刻MV 面向音乐人、内容创作者和品牌团队,帮助用户低成本完成歌曲 MV、歌词视频、AI 分镜、图生视频与最终合成。

      蛙蛙写作 网页版
      蛙蛙写作 网页版

      蛙蛙写作 AI 创作工具,覆盖小说、剧本、文案,一键生成文稿,打通文字转视频全流程,高效解决创作难题。

      讯飞智作 网页版
      讯飞智作 网页版

      讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

      超级简历WonderCV 网页版
      超级简历WonderCV 网页版

      超级简历WonderCV是面向应届生和AI小白的智能求职平台,覆盖简历、面试与职业规划。

      音述AI 网页版
      音述AI 网页版

      音述AI,是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区。

      AionClaw Windows版
      AionClaw Windows版

      AionClaw 是可在桌面端运行的任务型 AI 助手,通过数字专家与技能市场组合办公、创作、数据和开发能力。

      Loomy Windows版
      Loomy Windows版

      Loomy 是科大讯飞推出的桌面 AI 助手,可通过对话、任务与工作目录协助处理办公、内容创作和资料整理。

      AirServer Windows版
      AirServer Windows版

      AirServer Windows版可把电脑变成AirPlay、Google Cast和Miracast无线投屏接收端,适合会议演示、课堂教学及家庭大屏分享。发送设备通常无需另装客户端,并可同时接收和智能排列多个镜像会话。