mysql 锁

全局锁

概念:对整个数据库加锁,加锁后整个数据库实例只能进行读操作,后续的DDL,DML的写语句均会被阻塞,直到等待时间到达或者锁被释放。

使用场景:数据库备份,对所有的表锁定,从而获取一致性视图,保证数据的完整性。

添加全局锁:flush tables with read lock

释放锁:unlock tables

数据库备份:mysqldump --single-transaction -h localhost -uroot -p123456 要备份的数据库名>要备份的地址.sql
--single-transaction 使用了InnoDb的快照读来实现的

表级锁

表级锁,每次操作锁住整张表,锁定力度大,发生所冲突概率最高,并发度最低。有以下几种:

  • 表锁

  • 元数据锁

  • 意向锁

  • 表锁

    分为两类:表共享读锁(read lock),表独占写锁(write lock)

    语法为:

    设置锁:lock tables 表名 read/write lock

    释放锁:unlock tables

    表共享读锁与表独占写锁互斥

    表独占写锁与其他锁均互斥
    读锁不会阻塞其他线程的读,但是会阻塞所有线程的写操作(包括当前线程)。(都可读,但是都不可以写)
    写锁会阻塞其他线程的读和写,但不阻塞当前线程的读写(只有自己可以进行读写操作)

  • 元数据锁(meta data lock,mdl)

    元数据锁加锁过程是系统自动控制的,无需显示的加锁。MDL主要是维护表元数据的一致性,当表上有活动的事务存在时,不允许执行DDL操作。为了避免DML和DDL的冲突,保证读写的正确性。

    只要对表进行操作无论读写无论是否有事务,都会为当前表添加元数据锁,这个锁存在performance_schema.metadata_locks中

  • 意向锁

    意向锁是为了避免DML操作时行锁与表锁之间的冲突,在InnoDb中添加了意向锁,使得表锁不用检查每行数据是否加锁,使用意向锁来减少表锁的检查。

    当为表中的数据添加行锁时,会添加为当前表添加相同所类型的意向锁,

    意向共享锁(IS):与表锁共享锁兼容,与表锁排它锁互斥。

    意向排它锁(IX):与表锁共享锁和排它锁均互斥。

行锁

行锁是每次操作锁住对应的数据,锁的力度较小,发生锁冲突的概率较低,并发度最高,在InnoDB引擎中,其数据是基于索引组织的,行锁是通过对索引上的索引项加锁。主要分为三类:

  • 行锁:锁定单个记录的锁,防止其他事务对这个记录进行update和delete操作,在rc和rr的隔离级别下都支持
  • 间隙锁:锁定索引记录间隙(不包含该记录),确保索引间隙不变,防止其他事务对这个间隙进行insert操作,产生幻读问题,支持RR隔离级别
  • 临界锁:是行锁和临界锁组合,同时锁住数据,并锁足行之前的间隙AP。支持RR隔离级别
复制代码
   行锁

共享锁(S):允许一个事务去读一行,阻止其他事务获取相同数据集的排它锁

排它锁(X):允许已获取排他锁的事务更新数据,阻止其他事务去获取相同数据集的排他锁和共享锁(不加锁的select语句还是可以执行的)

要先获取到共享锁或者排它锁才可以执行DML语句或者select ... lock in share mode或者 select ...for updata语句
2.

复制代码
   间隙锁和临界锁(临界锁左开右闭)

默认情况下,InnoDB的默认隔离界别是REPEATABLE READ,使用next-key(临界锁)来进行搜索和索引扫描,来防止幻读问题。间隙锁的唯一目的是防止其他事务插入间隙,间隙锁是可以共存的,一个事务采用了间隙锁不会妨碍另外一个事务想同一个间隙添加间隙锁。
行锁是痛过给索引项加锁的,如果给非聚簇索引加锁,同时也会给其对应的主键索引上的索引项加锁。 如果查询的索引项不存在,那么会给这个索引项加一个间隙锁,锁的起始范围是:索引项应该存放位置左右两边的索引项。

  1. 聚簇索引使用等值查询,如果查询的记录不存在,会将锁优化为间隙锁.

    比如执行update user set user_name = "六六" where id = 8;此时因为主键为8的记录不存在,那么就会对(6,9)这个区间添加间隙锁

  2. 非聚簇索引的等值查询,向右遍历时最后一个不满足查询条件时,next-key会退化为间隙锁

相关推荐
不太可爱的叶某人40 分钟前
【学习笔记】MySQL技术内幕InnoDB存储引擎——第5章 索引与算法
笔记·学习·mysql
岁岁岁平安42 分钟前
Redis基础学习(五大值数据类型的常用操作命令)
数据库·redis·学习·redis list·redis hash·redis set·redis string
量子联盟2 小时前
原创-基于 PHP 和 MySQL 的证书管理系统,免费开源
开发语言·mysql·php
小光学长3 小时前
基于vue框架的防疫科普网站0838x(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库
极限实验室3 小时前
使用 Docker Compose 简化 INFINI Console 与 Easysearch 环境搭建
数据库·docker·devops
飞翔的佩奇3 小时前
Java项目:基于SSM框架实现的旅游协会管理系统【ssm+B/S架构+源码+数据库+毕业论文】
java·数据库·mysql·毕业设计·ssm·旅游·jsp
智海观潮3 小时前
Flink CDC支持Oracle RAC架构CDB+PDB模式的实时数据同步吗,可以上生产环境吗
大数据·oracle·flink·flink cdc·数据同步
鬼才血脉4 小时前
Linux(centos)安装 MySQL 8
linux·mysql·centos
float_六七5 小时前
SQL六大核心类别全解析
数据库·sql·oracle
Code季风7 小时前
将 gRPC 服务注册到 Consul:从配置到服务发现的完整实践(上)
数据库·微服务·go·json·服务发现·consul