目录
插入意向锁 - Insert Intention Locks
前言
在高并发场景下数据库性能往往是尤为重要的,通常会采用一些缓存中间件来解决数据库并发问题。这篇文章将介绍数据库层面一些与并发有关的知识。
MySQL锁
1)锁类型
锁类型依赖于存储引擎,在InnoDB存储引擎中按照锁的粒度分为,行级锁 RECORD ,和表级锁TABLE
行级锁:是对表中的某些具体的数据行进行加锁
表级锁:是对整个数据表进行加锁
2)锁模式
锁模式,⽤来描述如何请求(申请)锁,分为共享锁(S)、独占锁(X)、意向共享锁(IS)、意向独占锁(IX)、记录锁(精准行锁)、间隙锁、Next-Key锁(临键锁)、AUTO-INC锁、空间索引的谓词锁等。
共享锁和排他锁 - Shared and Exclusive Locks
InnoDB实现了标准的行级锁,分为两种分别是共享锁(S锁)和独占锁(X锁),独占锁也称为排他锁。
共享锁(S锁):允许持有该锁的事务读取表中的一行记录,同时允许其他事务在锁定行上加另⼀个共享锁并读取被锁定的对象,但不能对其进行写操作,也就是加排他锁需要阻塞等待。
独占锁(X锁):允许持有该锁的事务对数据行进行更新或删除,同时不论其他事务对锁定行进行读取或修改都不允许对锁定行进行加锁,也就是加共享锁和排他锁都会阻塞。
示例:
- 如果事务T1持有R行上的共享锁(S),那么事务T2请求R行上的锁时会有如下处理:
- T2请求S锁会立即被授予,此时T1和T2都对R行持有S锁
- T2请求X锁不能立即被授予,阻塞到T1释放持有的锁
- 如果事务T1持有R行上的独占锁(X),那么T2请求R行上的任意类型锁都不能立即被授予,事务T2必须等待事务T1释放R行上的锁
读锁是共享锁的一种实现,写锁是排他锁的一种实现
意向锁 - Intention Locks
InnoDB支持多粒度锁,允许行锁和表锁共存
- InnoDB使⽤意向锁实现多粒度级别的锁,意向锁是表级别的锁,它并不是真正意义上的加锁,而只是在 data_locks 中记录事务以后要对表中的哪一行加哪种类型的锁(共享锁或排他锁),意向锁分为两种:
- 意向共享锁(IS):表示事务打算对表中的单个行设置共享锁。
- 意向排他锁(IX):表示事务打算对表中的单个行设置排他锁。
- 在获取意向锁时有如下协议:
- 在事务获得表中某一行的共享锁(S)之前,它必须⾸先获得该表上的IS锁或更强的锁。
- 在事务获得表中某一行的排他锁(X)之前,它必须⾸先获得该表上的IX锁。
- 意向锁可以提⾼加锁的性能,在真正加锁之前不需要遍历表中的行是否加锁,只需要查看⼀下表中的意向锁即可
- 在请求锁的过程中,如果将要请求的锁与现有锁兼容,则将锁授予请求的事务,如