Mysql进阶【2】论述锁机制,SQL加锁情况

news/2024/11/15 2:02:26/

  

1.MySQL 的锁机制

1.1按粒度分有三种:

  1. 全局锁:核心服务层实现,锁住数据库,full table with read lock;
  2. 表级锁:核心服务层实现,锁住数据库中的某张表
    1. 加表级读锁:本事务不能读取其他未加锁的表的信息
  3. 行级锁:存储引擎层实现,锁住的是某行的索引,也可以是索引的间隙
    1. 记录锁(Record Locks):锁定索引中一条记录。
    2. 间隙锁(Gap Locks):要么锁住索引记录中间的值,要么锁住第一个索引记录前面的值或者最后一个索引记录后面的值。
    3. 临键锁(Next-Key Locks):是索引记录上的记录锁和在索引记录之前的间隙锁的组合(间隙锁 + 记录锁)。
    4. 插入意向锁(Insert Intention Locks):做insert操作时添加的对记录id的锁。

行锁的锁是加在索引上,而非数据本身

  1. 临键锁(Next-Key Locks)相当于记录锁 + 间隙锁【左开右闭区间
  2. 间隙锁:未查询到该条语句,则加上间隙锁,保证索引间隙不被插入其他数据,防止幻读。锁住的是一个索引区间,开区间,不包括两边。
  3. 记录锁:等值查询,锁叫加在该条记录的索引上,而非记录本身

1.2按功能划分两种:

  1. 共享锁Shared Locks(S锁、读锁):加了读锁的记录,允许其他事务在加读锁(select....lock in share mode)
  2. 排他锁Exclusive Locks(X锁,写锁):写锁一加,其他事务不能在加其他写锁或者读锁(select for update)

2.分析 SQL 的锁定情况:delete from tt where uid = 123;

2.1读已提交RC

  1. 如果uid是索引,并且也是主键,并且找到了这台记录的话,会给这条记录加上写锁
  2. uid是唯一索引,不是主键,首先找到这条记录加上写锁,然后拿着主键去主键索引中找到这个记录也加上写锁。
  3. uid不是唯一索引,查询结果不唯一,查询到所有的符合条件的记录加锁,并且通过主键找到主键索引并加上锁
  4. uid不是索引,全表扫描都加上写锁,无论时候符合条件都加上写锁

2.2可重复读【RR】隔离级别

  1. 如果uid是索引,并且也是主键【查找到这条记录,然后给记录加写锁】
  2. uid是唯一索引,不是主键,【辅助索引里查找符合条件的记录,加上写锁,在拿主键到主键索引里边查找对应数据,也加上写锁】
  3. uid不是唯一索引,查询结果不唯一,【查找到符合条件的所有记录,记录不唯一加上写锁,然后再拿主键到主键索引里边查找到对应所有记录也加上写锁,并且记录间的数据加上间隙锁,查找下一个不符合条件的数据加上,符合条件与不符合条件之间的间隙加上间隙锁】
  4. uid不是索引【全表扫描,所有记录加上写锁与间隙锁,设置innodb_locks_unsafe_for_binlog 参数,对于不满足查询条件的记录,MySQL会提前放写锁,不加间隙锁】

 

 


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

相关文章

光模块失效的原因及预防措施汇总

光模块从生产到使用都必须有规范化的操作方法,任何不规范的动作都可能造成光模块隐性的损伤或者永久的失效,下面就跟着小编来学习一下预防光模块失效的方法吧! 一、光模块失效的主要原因 1、光模块受到静电伤害(ESD损伤)&#xf…

Python 将 CSV 分割成多个文件

文章目录 使用 Pandas 在 Python 中创建 CSV 文件在 Python 中将 CSV 文件拆分为多个文件根据行拆分 CSV 文件根据列拆分 CSV 文件 总结 在本文中,我们将学习如何在 Python 中将一个 CSV 文件拆分为多个文件。 我们将使用 Pandas 创建一个 CSV 文件并将其拆分为多个…

PC端品优购电商项目源码

品优购首页&#xff1a; 手机商品栏页面&#xff1a; 品优购注册页&#xff1a; 品优购首页项目源码&#xff1a; <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible&qu…

Vue.js 中的数据请求是什么?如何进行数据请求?

Vue.js 中的数据请求是什么&#xff1f;如何进行数据请求&#xff1f; Vue.js 是一款流行的前端框架&#xff0c;它提供了许多方便的工具和 API&#xff0c;用于构建交互式的用户界面。其中&#xff0c;数据请求是 Vue.js 中重要的一部分&#xff0c;它可以让我们从服务器获取…

深度学习技巧应用18-OFD格式文件与人工智能结合的技巧应用,实现OFD转文本、OFD自动分类与内容提取

大家好,我是微学AI,今天给大家介绍一下深度学习技巧应用18-OFD格式文件与人工智能结合的技巧应用,实现OFD转文本、OFD自动分类与内容提取。OFD格式文件被称为“中国版PDF”。它与PDF格式类似,是一种可读、可打印、可编辑、可存档的电子文档格式,但OFD格式相对于PDF格式更加…

毕业2年,月薪就有30K,太卷了吧......

想起两年前交流过的一个应届生&#xff0c;当时他刚毕业技术水平不高&#xff0c;进了一个小公司做软件测试实习工作。最近联系上了&#xff0c;不问不知道&#xff0c;一问吓一跳&#xff0c;他现在已经进了某一线大厂&#xff0c;月薪30K。这位朋友其实也没比别人强多少&…

typeORM报 QueryFailedError: Data truncated for column ‘role‘ at row 3

typeORM报 QueryFailedError: Data truncated for column ‘role’ at row 3 今天博主在拉下项目后配置完数据库文件后发现TypeORM连接不上数据库。紧接着报QueryFailedError: Data truncated for column role at row 3这个错误。 这个问题一出来&#xff0c;必须得把锅推给T…

vue制作自己的组件库(仿ElementUI)

1.首先自己创建个新的vue项目&#xff0c;之后更改下目录形式&#xff0c;将src文件更改为examples&#xff0c;这里是专门放组件展示的md文件&#xff0c;packages文件里是放自己写的组件代码 2.然后是开始配置vue.config.js文件 &#xff0c;其中md-loader是读取md文件的相关…