1、当数据库中有多个事务并发执行时,事务的隔离性不一定能保持。确保隔离性的方法之一是要求对数据项以互斥的方式进行访问。
2、锁的使用需要先申请lock-S(Q),事务只有在并发控制器授予所需锁后才能继续其操作。共享锁和排他锁的使用可以让多个事务读取一个数据项但是限制同时只能有一个事务进行写操作。
3、共享型与共享型是相容的,而与排他型不相容。在任何时候,一个具体的数据项上可同时有(被不同的事务持有的)多个共享锁。此后的排他锁请求必须一直等待直到该数据项上的所有共享锁被释放unlock(Q)。
注意,一个事务只要还在访问数据,它就必须拥有该数据项上的锁。
4、当死锁发生时,系统必须回滚两个事务中的一个。一旦某个事务回滚,该事务锁住的数据项就被解锁,其他事务就可以访问这些数据项,继续自己的执行。
5、封锁协议:限制了可能的调度数目。规定了事务何时对数据项们进行加锁、解锁。
6、饿死:事务T1总是不能在该数据项上加锁。
通过一下方式授权加锁来避免事务饿死:当事务Ti申请对数据项Q加M型锁时,并发控制管理器授权加锁的条件是:
1)不存在在数据项Q上持有与M型锁冲突的锁的其他事务。
2)不存在等待对数据项Q加锁且先于Ti申请加锁的事务。
因此,一个加锁请求就不会被其后的加锁申请阻塞。
7、保证可串行化的一个协议是两阶段封锁协议。该协议要求每个事务分为两个阶段提出加锁和解锁申请。
1)增长阶段:事务可以获得锁,但不能释放锁。
2)缩减阶段:事务可以释放锁,但不能获得新锁。
注意,两阶段封锁并不保证不会发生死锁。在此协议下,级联回滚可能发生。而且除了调度可串行化外,调度还应该是无级联的。
8、锁转换:
升级:表示从共享到排他的转换。
降级:表示从排他到共享的转换。
注意,锁转换不能随意进行。锁升级只能发生在增长阶段,锁降级只能发生在缩减阶段。
9、锁管理器可以实现为一个过程,它从事务接受消息并反馈消息。或者要求事务回滚的消息(发生死锁时)。解锁消息只需要得到一个确认回答,但可能引发为其他等待事务的授予锁消息。
锁表:锁管理器为目前已加锁的每个数据项维护一个链表,每一个请求为链表中的一条记录,按请求到达的顺序排序。
10、树形协议中,可用的加锁指令只有lock-X。每个事务Ti对一数据项最多能加一次锁,并且必须遵守以下规则:
1)Ti首次加锁可以对任何数据项进行。
2)此后,Ti对数据项Q加锁的前提是Ti当前持有Q的父项上的锁。
3)对数据项解锁可以随时进行。
4)数据项Ti加锁并解锁后,Ti不能再对该数据项加锁。
注意,所有满足树形协议的调度是冲突可串行化的。(树形协议保证不会产生死锁)
11、死锁处理:
1)死锁预防实现:一是通过对加锁请求进行排序或要求同时获得所有的锁来保证不会发生循环等待。
二是每当等待有可能导致死锁时,进行事务回滚而不是等待加锁。
2)防止死锁的另一种机制是对所有的数据项强加一个次序,同时要求事务只能按次序规定的顺序封锁数据项。
12、死锁检测与恢复:
检查系统状态的算法周期性地激活,判断有无死锁发生。如果死锁发生,则系统必须试着从死锁中恢复。为实现这一点,系统必须:
1)维护当前将数据项分配给事务的有关信息,以及任何尚未解决的数据项请求信息。
2)提供一个使用这些信息判断系统是否进入死锁状态的算法。
3)当检测算法判定存在死锁时,从死锁中恢复。
13、死锁检测:
死锁可以用等待图(有向图)来描述。该图由G=(V,E)对组成,其中V是顶点集,E是边集。当且仅当等待图包含环时,系统中存在死锁。
14、何时激活检测算法?答案取决于两个因素:
1)死锁发生频度怎样?
2)有多少事务将受到死锁的影响?
15、解除死锁:回滚一个或多个事务。需要采取的动作有:
1)选择牺牲者。(应使事务回滚带来的代价最小)
2)回滚。(彻底回滚,部分回滚)
3)饿死。有可能同一事务总是被选为牺牲者,这样会产生饿死现象(必须保证一个事务被选为牺牲者的次数有限且最少)
16、另一种决定事务可串行化次序的方法是事先选定事务的次序。最常用的是时间戳排序机制。
1)使用系统时钟的值作为时间戳。即事务的时间戳等于该事务进入系统时钟的时钟值。
2)使用逻辑计数器,每赋予一个时间戳,计数器增加计数。即事务的时间戳等于该事务进入系统时的计数器值。
(即事务的时间戳决定了串行化顺序)
17、基于有效性检查的协议:
要求每个事务Ti在其生命周期中按两个或三个阶段执行,这取决于该事务是一个只读事务还是一个更新事务。顺序为:
1)读阶段。2)有效性检查阶段。3)写阶段。
每个事务必须按照以上顺序经历这些阶段。然而,并发执行的事务的三个阶段可以是交叉执行的。
18、快照隔离是一种基于有效性检查的多版本并发控制协议,它不需要将事务声明为只读或更新的。它不保证可串行化。
19、插入操作可能导致幻象现象,这时插入操作与查询发生逻辑冲突,尽管两个事务可能没有存取共同的元组。如果封锁仅加在事务访问的元组上,这种冲突就检测不到。
20、通常,特殊的技术用到B+树上,以允许较大的并发性。这些技术允许对B+树进行非可串行化访问,但它们保证B+结构是正确的,并保证对数据库本身的存取是可串行化的。