| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> MySQL 锁篇 -> 正文阅读 |
|
[大数据]MySQL 锁篇 |
文章目录MySQL 有哪些锁全局锁定义:对整个数据库进行加锁,常用于数据库的备份 如果要使用全局锁,执行下面这条SQL
执行后,数据库的状态就处于只读的状态 如果要释放全局锁,执行下面这条SQL
使用场景mysql 数据备份的时候,只读状态防止数据被修改,导致数据不同步的情况 缺点很明显,当数据库处于只读状态的情况下,对于业务来说,只能够进行读数据,不能更新新增数据,导致业务停滞。 表级锁表级锁的种类:
表锁首先了解如何去加一个表锁
解锁
表级锁相对于全局锁来说粒度减小了,但事实上粒度还是过大,导致并发的阻塞时间可能会比较长,所以不推荐使用 元数据锁metadata lock,简称 MDL,当对数据库表进行操作的时候,会自动给相应操作的表加上 MDL 锁:
就相当于自动加上相应表读写锁,在执行语句的时候
读写锁是互斥的,申请锁的时候形成一个等待队列,等待获取锁
在提交事务后,会主动释放锁 意向锁存在于 InnoDB 引擎,为了获取锁的目的而服务
当 插入、修改、删除 操作的时候,需要先对表加上 普通的 select 是没有带锁的,利用 MVCC 实现一致性读,是无锁的
意向锁不会与行级锁发生冲突!意向锁不会与行级锁发生冲突!意向锁不会与行级锁发生冲突! 意向锁是表锁,意向锁之间是互相兼容的 下面说明一个例子:(例子中加的都是
所以 AUTO-INC锁这个锁是主键自增的时候所使用的锁,一般来说,如果开启了主键自增,新增语句都不需要填写 ID
为了防止并发插入的时候,主键自增被打乱,所以需要在 所以在 MySQL 5.1.22 版本开始,InnoDB 提供了轻量级的锁来实现自增
InnoDB 存储引擎提供了个 innodb_autoinc_lock_mode 的系统变量,是用来控制选择用AUTO-INC锁,还是轻量级锁
轻量级锁是性能最高的,但是当并发插入的时候,会导致自增的值不连续的情况发生,这样当主从同步的时候,binlog 中记录的是 sql 语句,在从库执行的 SQL 自增的值可能就会发生不同的情况,这样会导致主从数据不一致 表锁的使用时机当数据列不加索引的时候,也就是查询条件 行级锁InnoDB 引擎是支持行级锁的,而 MyISAM 并不支持 InnoDB 拥有的 MVCC,使得
当开启自动提交事务的时候,一条语句会自动开启关闭事务,那么锁定读就会自动释放锁 行级锁主要有以下三类
Record LockRecord Lock 被称为记录锁,锁住的是一条记录,有 X 锁(读锁)和 S 锁(写锁)的区别:
触发加锁 Gap LockGap Lock 被称为间隙锁,只存在于可重复读隔离级别,作用是阻挡插入,目的是为了解决可重复读隔离级别下的幻读现象
假设事务A执行插入SQL
这时候就会对(2,5)的间隙中加锁,如下图所示
就会由于间隙锁的存在,不能够成功插入,需要循环获取间隙锁
Next-Key LockNext-Key Lock 称为临键锁,是 Record Lock + Gap Lock 的组合,锁定一个范围 + 记录本身
一般来说,执行唯一索引范围查询时会加上这样的锁(非快照读)
插入意向锁插入意向锁是一种特殊的间隙锁,,属于行级别锁,其目的是为了增加并发程度,减少等待的时间
用上面说到的间隙锁举例 insert 语句在插入前,会在 gap 加上 插入意向锁,如果是主键索引,则会进行 Duplicate Key 判断,如果存在相同 Key 且该 Key 被加了互斥锁,则还会加共享锁,然后等待(因为这个相同的 Key 之后有可能会回滚删除,这里非常容易死锁)。等到成功插入后,会在这条记录上加记录锁
幻读的出现问题还是依赖于 行锁的使用时机默认的情况下,InnoDB 优先时去加 Next-Key Lock,但根据优化规则,InnoDB 会对锁进行降级处理,比如 降级为 Record Lock,或者是间隙锁
参考资料小林coding 有哪些锁 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 5:06:27- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |