并发控制

一、并发方式

①交叉并发方式:单处理机系统中,事务的并行执行实际上是这些并行事务的并行操作轮流交叉进行,这种并发执行的方式称为交叉并发方式。

②同时并发方式:多处理机系统中,每个处理机运行一个事务,多个处理机同时运行多个事务,实现多个事务真正地并发执行,这种并发执行方式为同时并发方式。

二、并发控制概述

事务是并发控制的基本单位,事务的ACID特性(原子性,一致性,永久性,隔离性)遭到破坏的原因之一是多个事务对统一数据的并发操作。为了保证事务隔离性和一致性,DBMS需要对并发操作进行正确调度,这也就是并发控制机制的责任。

并发操作带来的数据不一致性主要包括:丢失修改,不可重复读,读”脏“数据。

丢失修改:

两个事务T1,T2读取同一数据并进行修改,后提交的事务对数据所做的修改覆盖了先提交的事务对该数据的修改。

不可重复读:

事务T1读取某数据后,事务T2对该数据进行更新,使得T1无法再现前一次读取的结果。主要有三种情况。

①T1读取某一数据后,T2对该数据进行修改,当T1再次读取该数据时,读取的结果与前一次不一样。例如T1读取某数据后进行运算并得到结果,T2对该数据进行了修改,T1再次读该数据进行验算时,验算结果不一致。

②T1按一定条件读取某些数据记录后,T2删除了其中部分数据,T1再次按相同条件读取时,发现一些数据神秘消失。

③T1按一定条件读取某些记录后,T2出入了一些数据,T1再以同样的条件读取数据是,发现多了一些记录。

后两种的不可重复读,也叫做”幻影现象“。

读脏数据:

T1读取某一数据并进行修改,将其写回磁盘,T2读取同一数据后,T1由于某些原因被撤销,这是T1已修改过的数据恢复原值,T2读到的数据就与数据库中的数据不一致,T2读到的数据就成为”脏“数据。

产生以上三类数据不一致是由于并发操作破坏了事务的隔离性。

三、并发控制的技术(封锁)

并发控制的主要技术有:封锁,时间戳,乐观控制法。商用DBMS通常采用封锁方法。

(1)基本封锁类型:排他锁(X锁),共享锁(S锁)

排他锁(写锁):如果事务T对数据对象A加了X锁,则只允许T读取和修改A,其他任何事务不可以再对A加任何类型的锁,直到T释放A上的锁。

共享锁(读锁):如果事务T对数据对象A加了S锁,则只允许T读取A但不可以修改A,其他事务只能再对A加S锁,不能加X锁,知道T释放A上的S锁。

活锁:某事务请求某资源,但是该资源总是被分配给其他事务,而这个早来的则可能永远等待下去。解决活锁的方法是先来先服务。

死锁:两个或两个以上的事务处于相互等待状态,且这种状态永远的保持,除非外界的干扰。而活锁并不是相互等待,只是总是得不到某资源。

(2)死锁问题解决方法有两种:预防死锁,诊断和解除

①死锁预防:一次封锁法,要求每个事物必须一次将所要使用到的所有数据全部加锁。

             顺序封锁法:预先对数据对象规定一个封锁顺序,所有的事务都按照这个顺序封锁。

DBMS解决死锁的方法通常是诊断和解除。

②死锁的诊断与解除

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

等待图法:事务等待图是一个有向图G=(T,U),T是节点的集合,代表正在运行的事务,U为边的集合,每个边表示事务等待情况。若T1等待T2,则T1和T2之间有一条有向边,从T1指向T2. 如果存在环路,则说明发生了死锁。

四、并发调度的可串行性

(1) 可串行化调度

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

可串行是并发事务正确调度的准则,一个给定的并发调度,当且仅当是可串行化的,才认为是正确调度。

(2)冲突可串行化调度

冲突操作是指不同的事务对同一个数据的读写操作和写写操作,其他的都不是冲突操作。不同事物的冲突操作和同一事务的两个操作时不能交换的。

一个调度SC在保证冲突操作的次序不变得情况下,通过交换两个事务不冲突操作的次序得到另一个调度SC',如果SC'是串行的,则称调度SC为冲突可串行的调度。一个事务是冲突可唤醒的,一定是可串行的。注意,不满足冲突可串行地调度也可能是可串行地调度。

(3)两段锁协议(2PL)

目前,DBMS普遍采用两段锁协议实现并发调度的可串行性,从而保证并发调度的串行化调度。理论上已经证明,两段所协议产生的是可串行化调度。两段锁协议是产生可串行化调度的充分条件。

两段锁协议的内容:

a,对任何数据进行读、写操作之前,首先要申请和获得对该数据的封锁。

b,在释放一个封锁之后,事务不在申请和获得任何其他锁。

所谓“两段”即:事务分为两个阶段,第一个阶段是获得封锁,也称为拓展阶段。在这个阶段,事务可以申请获得任何数据上的任何类型的锁,但是不能释放任何锁。第二阶段是释放封锁,也称收缩阶段,在这个阶段,事务可以释放任何数据项上的任何类型的锁,但是不能再申请任何类型的锁。

如果并发执行的事务均遵循两段锁协议,则这些事务的任何并发调度策略都是可串行化的。

 

 

 

 

 

 

 

posted @ 2013-03-11 11:13  伴夏  阅读(700)  评论(0编辑  收藏  举报