一、学习过程中对概念的归类、总结
看了好几天博客,学的挺艰难,由于锁的种类比较多,大多数博客仅仅是罗列出来,分不清这些概念的上下级或者说包含关系,也可以理解为每个概念的作用域,所以看起来很痛苦,也记不住,有种死记硬背的感觉。然后今天突发灵感,有了一点突破,记录一下,如有不对,日后再修改。
下面定义的共享锁、排它锁,应该说只是一个广泛的行锁的概念。就像我们说汽车、房子、饮料,而没有说具体的什么汽车、什么房子、什么饮料。而像下面会提到的Record Lock、Gap Lock、Next-key lock这三种锁,应该就是具体的行锁,比如客车、别墅、冰红茶。这三种具体行锁分别属于共享锁、排他锁两个大类别类别。具体属于哪个类别那要看加锁场景。如果是select语句加锁,那就属于共享锁类别、如果是insert、delete、update加锁,那就属于排它锁类别。
声明:非本专业人员,如有不对,希望有缘人不吝赐教。
二、InnoDB引擎行锁的介绍
InnoDB 有以下两种类型的锁
- 共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。
- 排他锁(X):允许获得排他锁的事务更新数据,阻止其他事务取得相同数据集的共享读锁和排他写锁。
除此之外还有两种意向锁
- 意向共享锁(IS):事务打算给数据行加行共享锁,事务在给一个数据行加共享锁前必须先取得该表的IS锁。
- 意向排他锁(IX):事务打算给数据行加行排他锁,事务在给一个数据行加排他锁前必须先取得该表的IX锁。
意向锁是InnoDB自动加的,不需要用户干预。UPDATE/DELETE/INSERT 语句 InnoDB 会自动给涉及的数据集加排他锁。普通的 SELECT 语句 InnoDB 不加锁。不过可以在语句中显式的给数据集加共享锁或者排他锁。
在 RC(read commited)级别中,数据的读取都是不加锁的,但是数据的写入、修改和删除是需要加锁的。
InnoDB 行锁是通过给索引项加锁实现的,如果没有索引,InnoDB 将通过隐藏的聚簇索引来对记录加锁。 InnoDB 行锁有三种情形:
- Record Lock:对索引项加锁
- Gap Lock:对索引之间的“间隙”、第一条记录前的“间隙”或最后一条记录的“间隙”加锁。
- Next-key lock:前两种的组合,对记录及其前面的间隙加锁。
如果不通过索引条件检索数据,那么 InnoDB 将对表中的所有记录加锁,实际效果就和表锁一样了。
引用文章:
https://www.jianshu.com/p/2e908f0de8d0