6-3DBMS并发控制

来源:互联网 发布:matlab在线编程 编辑:程序博客网 时间:2024/05/01 16:48

6-3DBMS并发控制

tags:数据库

事务是并发控制的基本单位,保证事务的ACID特性是事务处理的重要人物,而事务的ACID特性可能遭到破坏的原因之一是多个事务对数据库的并发操作造成的,为了保证事务的隔离性和一致性,数据库管理系统需要对并发操作进行正确的调度.这就是数据库管理系统的并发控制.

并发控制的主要技术有封锁,时间戳,乐观控制法和多版本并发控制.

名词解释

丢失修改

两个事务T1,T2读入同一数据并修改,T2提交的结果破坏了T1提交的结果,导致T1的修改被丢失.

不可重复读

不可重复读是指事务T1读取数据后,事务T2执行更新操作,使T1无法再现前一次读取结果.具体包括以下三种情况:
1. 事务T1读取某一数据后,事务T2对其进行了修改,当事务T1再次读取该数据时,得到与前一次不同的值.
2. 事务T1按照一定条件从数据库中度去了某些数据记录后,事务T2删除了其中部分记录,当T1再次按照相同条件读取数据时,发现某些记录神秘的消失了.
3. 事务T1按照一定条件从数据库中读取数据记录后,事务T2插入了一些记录,当再次读取记录时,发现多了一些记录.
后两种情况也被称为幻影现象.

读脏数据

读脏数据是指事务T1修改某一数据并将其写回磁盘,事务T2读取同一数据后,T1由于某种原因被撤销,这是被T1修改过的数据恢复原始值,T2读到的数据就与数据库中的数据不一致,则T2读到的数据为脏数据.

封锁

所谓封锁就是事务T在对某个数据对象进行操作之前先想系统刚发出请求,对其加锁.加锁后事务T就对该数据对象有了一定控制,在事务T释放它的锁之前,其他事务不能更新此数据对象.

排它锁(X锁)写锁

若事务T对数据对象A加上X锁,则只允许T读取和修改A,其他任何事务都不能再对A加任何类型的锁,直到T释放A上的锁为止.这就保证了其他事务在T释放A上的锁之前不能再读取和修改A

共享锁(S锁)读锁

若事务T对数据对象A加上X锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁为止.这就保证了其他事务可以读A,但是T释放A上的S锁之前不能对A做任何修改.

封锁协议

用X与S锁对数据进行加锁时,还需要约定一些规则,何时申请X锁或者S锁,持锁的时间,释放锁的时间等.这些规则被称为封锁协议.不同级别的封锁协议达到的系统一致性级别是不同的.

一级封锁协议

事务T在修改数据R之前必须先对其加X锁,直到事务结束释放.

一级封锁协议可以防止丢失修改的情况,并保证事务T是可恢复的.

在一级封锁协议中,如果仅仅是读数据而不对其进行修改,是不需要加锁的,所以它不能保证可重复读和不读脏数据.

二级封锁协议

在一级封锁协议的基础上增加事务T在读取数据R之前必须先对其加S锁,读完后可释放S锁.

二级封锁协议除了防止丢失修改,还可以进一步防止读脏数据.(读之前要加锁,防止读之前有事务正在写,读完后,写事务发生回滚的情况)

在二级封锁协议中,由于读完数据后即可释放S锁,所以它不能保证可重复读.(一个事务读完数据后释放锁,这个时候有一个事务写,而后之前事务继续读,而结果与第一次不同)

三级封锁协议

三级封锁协议是指,在一级封锁协议的基础上增加事务T在读取数据R之前必须先对其加S锁,直到事务结束才释放.

三级封锁协议可以防止丢失修改,读脏数据和可重复读问题.

死锁与活锁

活锁

某一事务一直处于等待状态,T1锁住了R,T2请求R,T2等待,T3也请求R,T1释放R后给了T3,T3释放后又给了T4…T2很难过.

可以使用先来先服务的原则处理.

死锁

与操作系统相同,一般有两种解决方法:预防与解除.

死锁的预防

一次封锁法

一次封锁法要求每个事务必须一次将所有要使用的数据全部加锁,否则就不能继续执行.类似操作系统中的静态封锁.

一次封锁法的缺点:
1. 扩大了封锁范围从而降低了系统的并发度.
2. 数据库中的数据是不断变化的,原来不要求封锁的数据在执行过程中可能会编程封锁对象,所以很难事先精确的确定每个事务锁要封锁的数据对象,为此只能扩大封锁范围,将事务在执行过程中可能要封锁的数据对象全部加锁,这就进一步降低了并发速度.

顺序封锁法

顺序封锁法是预先对数据对象规定一个封锁顺序,所有事务都按照这个顺序实施封锁.

顺序封锁法的缺点:
1. 数据库系统中封锁的数据对象多,并且随数据的插入删除操作而不断变化,要维护这些资源的封锁顺序十分困难,成本高.
2. 事务的封锁请求可以随着事务的执行而动态的决定,很难实现确定一个事务要封锁哪些对象,因此也就很难按规定的顺序去施加封锁.

可见在操作系统中广为采用的预防死锁的策略不太适用于数据库.数据库一般采用诊断解除的方法.

死锁的诊断解除

超时法

如果一个事务的等待时间超过了规定的时限,就认为发生了死锁.

等待图法

事务的等待图是一个有向图,类似操作系统中的资源请求图.可以根据判断有无回路来确定死锁.

数据库管理系统的并发控制子系统一般在检测到死锁后选择一个处理死锁代价最小的事务,将其撤销,释放这个事务所有的锁以使其他事务继续进行下去.

并发调度的可串行性

可串行化调度

多个事务并发执行是正确的,当且仅当其结果与按照某一次序串行化的执行这些事务时结果相同,称这种调度策略为可串行化调度.

可串行性是并发事务正确调度的准则.按照这个准则规定,一个给定的并发调度,当且仅当它是可串行化的,才认为是正确调度.

冲突操作

冲突操作是指不同事务同一个数据的读写操作和写写操作:
1. Ri(X),Wj(X) /事务Ti读X,事务Tj写X,其中i≠j/
2. Wi(X),Wj(X) /事务Ti写X,事务TJ写X,其中i≠j/
其他不是不冲突操作

不同事务的冲突操作和同一事务的两个操作是不能交换的.

一个调度Sc在保证冲突操作的次序不变的情况下,通过交换两个事务不冲突操作的次序得到另一个调度Sc’,若Sc’是串行的,则调度Sc为冲突可串行化调度.若一个调度是冲突可串行化,则一定是一个可串行化调度.

冲突可串行化调度是可串行化调度的充分条件,而不是必要条件.还有不满足冲突可串行化条件的可串行化调度.

两段锁协议

目前数据库普遍使用两段锁协议的方式实现并发调度的可串行性,从而保证调度的正确性.

两段锁协议是指所有事务必须分两个阶段对数据项加锁和解锁:
1. 在对任何数据进行读,写操作之前,首先要申请并获得该数据的封锁.即扩展阶段
2. 在释放一个封锁后,事务不再申请和获得任何其他封锁.即收缩阶段.

可以证明,若并发执行的所有事务均遵循两段锁协议则对这些事务的任何并发调度策略都是可串行化的.

需要说明的是,事务遵守两段锁协议是客串行化调度的充分条件,而不是必要条件.

封锁的粒度

封锁对象的大小称为封锁粒度.封锁对象可以是关系,属性值,属性值集合,元组,整个数据库,某个物理页等.

封锁粒越大效率越高,但并发度越小,封锁粒度越小效率低,但并发度高.

因此,一个系统中同时支持多重封锁粒度供不同的事务进行选择是比较理想的,这种封锁方式称为多粒度封锁.

多粒度封锁

数据库会将数据库对象作为结点,然后构建一个多粒度树.

多粒度封锁协议允许多粒度树中的每个结点被独立地加锁,多一个结点加锁意味着这个结点的所有后裔节点也被加同样类型的锁.因此多粒度封锁中一个数据库对象可能有两种封锁方式,显式封锁和隐式封锁.

一般地,对某个数据对象加锁,系统要检查该数据对象上有无显示封锁与之冲突;再检查所有父节点,看本事务所的显式锁是否和该数据对象的隐式锁冲突.还要检查其子节点看它们的显示封锁是否与事务冲突.

意向锁

IS锁

如果对一个数据对象加IS锁,表示它的后裔节点拟加S锁

IX锁

如果对一个数据对象加IX锁,表示它的后裔结点拟加X锁

SIX锁

如果对一个数据对象加SIX锁,表示对它加S锁,再加IX锁.例如对某个表加SIX锁,则表示该事务要读整个表,同时会更新个别元组.

几种锁的偏序关系如下:
X>SIX>S=IX>IS

检查数据库和R1是否已经加了不相容的锁(X或者IX),不需要再搜索和检查R1中的元组是否加了不相容的锁(X锁).

意向锁的含义是:对任一结点加锁时,必须先对它的上层结点加意向锁。例如事务 T 要对某个元组加 X 锁,则首先要对关系和数据库加 ix 锁。换言之,对关系和数据库加 ix 锁,表示它的后裔结点 ― 某个元组拟(意向)加 X 锁。引进意向锁后,系统对某一数据对象加锁时不必逐个检查与下一级结点的封锁冲突了。例如,事务 T 要对关系 R 加 X 锁时,系统只要检查根结点数据库和 R 本身是否已加了不相容的锁(如发现已经加了 ix ,则与 X 冲突),而不再需要搜索和检查 R 中的每一个元组是否加了 X 锁或 S 锁。

意向锁相容表
此处输入图片的描述

###时间戳法

时间戳方法给每一个事务盖上一个时标,即事务开始执行的时间.每个事务具有唯一的时间戳,并按照这个时间戳来解决事务的冲突操作.如果发生冲突操作,就回滚具有较早时间戳的事务,以保证其他事务的正常执行,被回滚的事务被赋予新的时间戳并从头开始执行.

乐观控制法认为事务执行时很少发生冲突,因此不对事务进行特殊的管制,而是让他自由执行,事务提交前再进行正确性检查.如果检查后发现该事务执行中出现过冲突并影响了可串行性,则拒绝提交并回滚该事务.

###多版本控制法

假设一个数据对象A有两个事务T1写,T2读.假设先启动T1再启动T2.如果在T1准备写A时不是等待,而是为A生成一个新的版本,那么T2就可以继续在A’上执行,知识在T2准备提交的时候检查一下事务T1时候已经完成.如果T1已经完成T2就可以放心的提交;如果T1还没有完成,那么T2必须等待直到T1完成.

多版本控制系统的主要好处是消除了数据库中数据对象读和写操作的冲突,有效提高的系统的性能.

###改进的多版本并发控制

除了传统的读,写锁外,引进另一个新的封锁类型,称为验证锁.

写事务提交的时候,必须首先获得在那些加了写锁数据镀锡i昂上的验证锁,由于验证锁和读锁是不相容的,所以为了得到验证锁,写事务不得不延迟它的提交,直到所有被他加上写锁的数据对象都被所有那些正在读它们的事务释放.一旦写事务获得验证锁,系统就可以丢弃数据库对象的旧值,代之于新的版本.

在这里数据库只要维护数据对象的两个版本.MV2PL把封锁机制和时间戳方法相结合,维护一个数据的多个版本,即对于关系表上的每一个写操作,产生r的一个新版本,同时会保存前一次修改的数据版本,

MV2PL和封锁机制相比,主要的好处是在多版本并发控制中,对数据的读写锁要求不冲突,读不会阻塞写,而写也不阻塞读,从而有效提高并发.

0 0
原创粉丝点击