首页 > 数据库 >Mysql 之锁详细篇

Mysql 之锁详细篇

时间:2022-11-26 14:44:49浏览次数:45  
标签:10 之锁 辅助 记录 主键 索引 详细 Mysql id

一、锁的分类
1、范围:全局锁、表级锁、行级锁
2、功能分类:共享锁、排它锁

二、数据库的全局锁
加锁:mysql> flush tables with read lock;
释放锁:mysql> unlock tables;

三、MySQL的表级锁(都是Server层实现的)
1、表级的共享锁:lock table 表名 read; 可以共享读操作,不能做些操作。
2、表级的排他锁:lock table 表名 write; 对表处于一个独享状态。
3、元数据锁:在一个事务中对一个表进行查询操作,不允许其他回话对表结构进行修改,就在表上加元数据锁。
4、自增锁:使用自增字段时,使用自增主键保证主键不冲突有一个自增锁。

四、MySQL的行级锁
要求必须使用InnoDB引擎。
行级锁:
记录锁(Record Locks): 锁定索引中一条记录。
间隙锁(Gap Locks): 要么锁住索引记录中间的值,要么锁住第一个索引记录前面的值或者最后一个索引记录后面的值。
临键锁(Next-Key Locks):是索引记录上的记录锁和在索引记录之前的间隙锁的组合(间隙锁+记录锁)。
插入意向锁(Insert Intention Locks):做insert操作时添加的对记录id的锁。
意向锁IX、IS,当数据库中某条记录上有行锁时,需要在表上增加一个标志位,代表当前表中某行记录上有行锁。
1)记录锁
根据主键等值更新时使用记录锁。
共享记录锁:select * from t where id = 1 lock in share mode;
排他记录锁:select * from t where id = 1 for udpate;
2)意向锁
标记当前表中是否有行锁的存在。
行锁:S 意向锁:IS
行锁:X 意向锁:IX
3)间隙锁
在记录和记录之间的范围区间就是间隙,间隙锁就是加区间之上的,防止插入数据。目的就是防止幻读。

行锁加锁规则
1)主键索引
1. 等值查询
(1)命中记录,加记录锁。
(2)未命中记录,加间隙锁。
2. 范围查询
(1)没有命中任何一条记录时,加间隙锁。
(2)命中1条或者多条,包含where条件的临键区间,加临键锁

2)辅助索引
1. 等值查询
(1)命中记录,命中记录的辅助索引项+主键索引项加记录锁,辅助索引项两侧加间隙锁。
(2)未命中记录,加间隙锁
2. 范围查询
(1)没有命中任何一条记录时,加间隙锁。
(2)命中1条或者多条,包含where条件的临键区间加临键锁。命中记录的id索引项加记录锁。

行锁分析
delete from t1 where id = 10;
1 id是主键索引,隔离级别RC, 在id=10的这条记录上加上X锁
2 id是unique辅助索引,隔离级别RC,在辅助索引id=10上的唯一一条记录加X锁,根据辅助索引找到唯一一条主键记录,并加上X锁
3 id是非唯一的辅助索引,隔离级别RC,在辅助索引id=10上多条记录上加X锁,根据辅助索引找到多条主键记录,并加上X锁
4 id不是索引,存储引擎对所有记录加锁,之后由server层对根据id=10进行过滤

5 id是主键索引,隔离级别RR, 在id=10的这条记录上加上X锁
6 id是unique辅助索引,隔离级别RR,在辅助索引id=10上的唯一一条记录加X锁,根据辅助索引找到唯一一条主键记录,并加上X锁
7 id是非唯一的辅助索引,隔离级别RR,在辅助索引id=10上多条记录上加X锁,此外在id=10附近加上间隙锁,根据辅助索引找到多条主键记录,并加上X锁
8 id不是索引,存储引擎对所有记录加锁并对间隙也加锁
9 串行化,delete操作与RR隔离级别相同

如何避免死锁呢?
MySQL默认会主动探知死锁,并回滚某一个影响最小的事务。等另一事务执行完成之后,再重新执行该事务。
如何避免死锁
1、注意程序的逻辑
根本的原因是程序逻辑的顺序,最常见的是交差更新
Transaction 1: 更新表A -> 更新表B
Transaction 2: 更新表B -> 更新表A
Transaction获得两个资源
2、保持事务的轻量
越是轻量的事务,占有越少的锁资源,这样发生死锁的几率就越小
3、提高运行的速度
避免使用子查询,尽量使用主键等等
4、尽量快提交事务,减少持有锁的时间
越早提交事务,锁就越早释放

标签:10,之锁,辅助,记录,主键,索引,详细,Mysql,id
From: https://www.cnblogs.com/mtjb1dd/p/16927408.html

相关文章

  • 使用Docker恢复Mysql8备份的Data数据 - 诚哥博客
    前段时间公司数据库服务器崩溃启动不起来,经过我初步排查是/home目录挂载不上导致启动不起来,虽然通过注释/etc/fstab中的挂载信息,启动了,但是发现mysql数据有缺失,还好有例......
  • mysql实战操作总结
    1、问题描述关于mysql操作,记录下;2、问题说明1.停止正在执行的sql数据量太大,数据库没反应,用的navicat,就在查询页面,执行:showprocesslist;---会显示对应的查询sql找到......
  • Vulnhub之KB-Vuln靶机详细解题过程
    KB-Vuln作者:jason_huawen靶机基本信息名称:KB-VULN:1地址:https://www.vulnhub.com/entry/kb-vuln-1,540/识别目标主机IP地址──(kali㉿kali)-[~/Vulnhub/KB_Vuln]......
  • Java下载文件的四种方式详细代码
    原文链接:https://www.jb51.net/article/232182.htm1.以流的方式下载publicHttpServletResponsedownload(Stringpath,HttpServletResponseresponse){try......
  • 红队渗透靶场之Jarbas靶场(超详细!)
    靶场考察点1.Jenkis平台的漏洞利用Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件项目可以进......
  • MySQL 简单造数
    造数背景主要造出一张时间字段的相关的数据,时间字段不能是一个固定值,数据范围需要随机分散在90天内的。构建测试表--测试表结构CREATETABLE`demo`.`order_info`(......
  • 传奇开服教程GOM引擎微端更新速度太慢的详细解决方法
    ​GOM引擎微端服务器程序限制了发送速度这里说的微端服务器程序不是微端服务器,而是程序,程序上是可以限制跟设置速度的,这个大家都做到,但还是有一些兄弟忘记了设置或者不知道......
  • Kettle:跨库(SQLServer->PostgreSQL)同步多张表数据的详细设计过程
    〇、参考地址1、多个Excel实现同步https://www.wangt.cc/2021/05/kettle%E5%A4%9A%E4%B8%AA%E8%A1%A8%E4%B8%80%E8%B5%B7%E8%BF%81%E7%A7%BB-%E9%80%9A%E8%BF%87%E9%85%8......
  • Java方法引用和构造器引用详细解释
    1什么是方法/构造器引用简单来说,方法引用是对lambda表达式的一种更加简便的写法。所谓引用,就是对当前已存在的一段代码的借用。方法引用则是隐式借用已经存在的方法作......
  • Linux安装MySQL
    Linux安装Mysql安装Linux安装Linux下载Mysql点击[下载]((https://downloads.mysql.com/archives/community/)跳转到MySQL在Linux中也可以使用wget+链接,需要先使用......