目录
前言
本文为JMU22级数据库原理考前复习而总结归纳,刨除了课本以及课堂上晦涩且长篇大论的文章,以尽量简洁易懂的语句来对知识点进行归纳。
继 上一篇文章 提到的“封锁粒度”接着对并发控制进行归纳总结。
封锁粒度
概念
即被封锁的数据对象的大小。
封锁对象可以是逻辑上的索引,元组,关系...也可以是物理上的数据页。
封锁粒度越大,并发度越低,但是开销越小。例如,对一个关系加锁,则一次只能修改一行数据,不能多个事务同时对不同元组进行操作,并发度低,但是需要显式加的只是一个锁,开销比较小。
不同操作的加锁粒度需求不同,所以就产生了多粒度封锁协议。
多粒度封锁
我们可以画出一个简单的三级多粒度树:
该协议规定,如果对一个节点加锁(显式加锁),那么其后代都要被加上同样的锁(隐式加锁)。
所以当事务想加锁成功,不仅要保证和当前节点已经有的锁相容,还要保证要和它的后代相容。一样的,当前节点的父节点也可能对当前节点有隐式加锁,所以也要保证和它的祖先相容。
那么每次加锁都得遍历一下所有的上下级,这样效率很低。
所以诞生了,意向锁。
意向锁
一个节点要加锁,就要对其所有上级节点都加上对应类型的意向锁。
一个节点被加了意向锁,代表有事务意图向其下级加对应类型的锁。
也就是说,上级节点可以体现出下级的操作,所以判断是否相容就不再需要遍历下级节点了,只需要判断上级节点就行。
类型
- IS锁 想加S锁就要对所有上级加IS锁。
- IX锁 想加X锁就要对所有上级加IX锁。
- SIX锁 S锁+XI锁
- ...
规则
简单来说就是任意相容锁和相容锁相容。相容锁和普通锁之间比较就去掉相容锁的I,然后比较。
SIX锁是S锁+IX锁,不是纯相容锁。
举例:
- x锁和SIX锁判断是否相容,需判断x锁和S锁是否相容 以及 x锁和IX锁(即判断x锁和X锁是否相容),显然都不相容。
- IS锁和SIX锁判断是否相容,需判断IS锁和S锁是否相容(即判断S锁和S锁是否相容) 以及 IS锁和IX锁是否相容,显然都相容。
- SIX锁和SIX锁判断是否相容,需判断S锁和S锁是否相容 以及 S锁和IX锁是否相容,显然后者不相容。
小结--引出问题
到此已经学了很多封锁规则。
针对三类并发问题引出的封锁协议:
- 针对丢失修改的一级封锁协议
- 针对丢失修改和脏读的二级封锁协议
- 针对不可重复读和丢失修改和脏读的三级封锁协议
针对活锁的
- 先来先服务(排队)
针对死锁的 - 一次封锁
- 顺序封锁(规定拿多个锁时的锁顺序)
针对可串行化的
- 两段锁协议
然而,幻读这个并发问题还没有解决。即使是三级封锁协议也没办法,因为加锁都是对已经存在的数据对象,对于即将存入的对象无法加锁。
所以产生了索引锁。
索引锁
对于有索引的数据对象,插入删除这样的改动必然会先导致索引的变动,那么可以加索引锁,这样就无法对索引修改,也就无法做插入删除操作。
标签:封锁,加锁,复习,索引,数据库,并发,粒度,相容,节点 From: https://www.cnblogs.com/lmj00/p/17852794.html