一、按照锁的粒度分类
latch 一般称为闩锁 (轻量级的锁) 因为其要求锁定的时间非常短,若迟勋时间长,则应用性能非常差,在 InnoDB 存储引擎中,latch 有可以分为 mutex(互斥锁) 和 rwlock(读写锁) 其目的用来保证并发线程操作临界资源的正确性,并且没有死锁检测的机制。操作缓冲池汇总的 LRU 列表,删除、添加、移动 LRU 列表中的元素等使用的都是 Latch。
mysql中的锁可以分为全局锁、表级锁、行锁
1.1、全局锁
全局锁就是对整个数据库实例加锁。mysql提供了一个加全局读锁的方法
-- 加锁flush tables with read lock;-- 释放锁unlock tables;
当你执行上述命令时,整个数据库都会处于只读状态;之后所有线程的以下语句都会被阻塞:增删改语句、数据定义语句(数据建表、修改表结构)。典型使用场景就是逻辑备份。
1.2、表锁
mysql表级锁有两种:一种是表锁、一种是元数据锁(meta data lock MDL);
表级锁的语法如下:
-- 加锁
lock tables t1 read/write
-- 释放锁
unlock tables;
客户端断开的时候自动释放锁。
二、锁的类型
2.1、表锁
2.1.1、种类
读锁
读锁,也叫共享锁,针对同一份数据,多个读操作可以同时进行而不会互相影响。
写锁
写锁,也叫排他锁,当前操作没有完成之前,会阻塞其它读和写操作(update、insert、delete)。
2.1.2、特点
对整张表加锁
开销小
加锁块
无死锁
锁粒度大,发生锁冲突概率大,并发性低
2.2、行锁
2.2.1、种类
读锁
读锁,也叫共享锁,允许一个事务去读一行,阻止其它事务的排它锁获得相同数据集
写锁
允许获得排它锁的事务更新数据,阻止其它事务的共享锁和排它锁获取相同的数据集
意向共享锁(IS)— 这个解释可能不太对,需要核对官方文档
一个事务给一个数据行加共享锁时,必须先获得表的IS锁
意向排他锁(IX)
一个事务给一个数据行加排它锁时,必须先获得该表的IX锁
2.2.2、特点
对一行数据加锁
开销大
加锁慢
会出现死锁
锁的粒度小,发生锁冲突概率低,并发性高。
两阶段锁
传统的RDMS加锁的一个原则,就是2PL(Two-Phase Locking,二阶段锁)。也就是说锁操作分为两个阶段:加锁阶段和解锁阶段,并且保证加锁阶段和解锁阶段不想交。也就是说在一个事务中,不管有多少条增删改,都是在加锁阶段加锁,在 commit 后,进入解锁阶段,才会全部解锁
https://juejin.cn/post/6891609761733672973
https://km.sankuai.com/page/461569596
https://zhuanlan.zhihu.com/p/94778920
https://km.sankuai.com/page/461575103
https://blog.csdn.net/JSWANGCHANG/article/details/87607639
https://www.cnblogs.com/crazylqy/p/7773492.html - mysql加锁过程
