6-3-4

来源:百度文库 编辑:神马文学网 时间:2024/04/28 03:16:43


6.3.1 并发操作带来的三个问题
1.丢失更新问题

(1)数据库中A的初值是100。
(2)事务T1对A的值减30,事务T2对A的值增加一倍。
(3)如果执行次序是先T1后T2,那么结果A的值是140。
(4)如果是先T2后T1,那么A的值是170。
(5)这两种情况都应该是正确的。
(6)但是按表中的并发执行,结果A的值是200,这个值肯定是错误的,因为在时间t7丢失了事务T1对数据库的更新操作。因而这个并发操作是不正确的。
2.读脏数据问题
(1)实例1:用户读了“脏数据”,但没有破坏数据库的完整性。

   ①事务T1把A的值修改为70,但尚未提交(即未做COMMIT操作),事务T2紧跟着读未提交的A值(70)。
   ②随后,事务T1做ROLLBACK操作,把A的值恢复为100。而事务T2仍在使用被撤销了的A值70。
   ③在数据库技术中,把未提交的随后被撤销的数据称为“脏数据”。
(2)实例2:用户读了“脏数据”,引起自身的更新操作被丢失,破坏了数据库的完整性。

   ①事务T2不仅在时间t4读了未提交的A值(70)。
   ②而且实际上在时间t8还丢失了自己的更新操作。
   ③此时破坏了数据库的完整性。
3.不可重复读问题

(1)T1需要两次读取同一数据项A。
(2)但是在两次读操作的间隔中,另一个事务T2改变了A的值。
(3)因此,T1在两次读同一数据项A时却读出了不同的值。 6.3.2 封锁技术
1.锁的定义
(1)锁(lock)是一个与数据项相关的变量,对可能应用于该数据项上的操作而言,锁描述了该数据项的状态。
(2)通常在数据库中每个数据项都有一个锁。
(3)锁的作用是使并发事务对数据库中数据项的访问能够同步。封锁技术中主要有两种封锁:排他型封锁和共享型封锁。
2.两种封锁类型
(1)排他型封锁(X锁)。
   ①定义。
   a.在封锁技术中最常用的一种锁是排他型封锁(Exclusive Lock),简称为X锁,又称为写锁。
   b.如果事务T对某个数据R(可以是数据项、记录、数据集乃至整个数据库)实现了X锁,那么在T对数据R解除封锁之前,不允许其他事务T再对该数据加任何类型的锁。这种锁称为“X锁”。
   ②使用X锁的两个操作。
   a.申请X锁操作“XFIND R”:表示事务对数据R申请加X锁,若成功,则可以读或写数据R;如果不成功,那么这个事务将进入等待队列,一直到获准X锁,事务才能继续做下去。
   b.解除X锁操作“XRELEASE R”:表示事务要解除对数据R的X锁。
   ③实例:加X锁后的事务更新。

   a.事务T1先对A实现X锁,更新A值以后,在COMMIT之后。
   b.事务T2再重新执行“XFIND A”操作,并对A进行更新(此时A已是事务T1更新过的值)。
   c.这样就能得出正确的结果。
(2)共享型封锁(S锁)
   ①定义。
   a.采用X锁的并发控制并发度低,只允许一个事务独锁数据。而其他申请封锁的事务只能排队去等。为此,降低要求,允许并发的读,就引入了共享型封锁(Shared Lock),这种锁简称为S锁,又称为读锁。
   b.如果事务T对某数据加上S锁后,仍允许其他事务再对该数据加S锁,但在对该数据的所有S锁都解除之前决不允许任何事务对该数据加X锁。
   ②使用S锁的三个操作。
   a.申请S锁操作“SFIND R”:表示事务对数据R申请加S锁,若成功,则可以读数据R,但不可以写数据R;如果不成功,那么这个事务将进入等待队列,一直到获准S锁,事务才能继续做下去。
   b.升级和写操作“UPDX R”:表示事务要把对数据R的S锁升级为X锁,若成功则更新数据R,否则这个事务进入等待队列。
   c.解除S锁操作“SRELEASE R”:表示事务要解除对数据R的S锁。
   ③说明。
   a.可以看出,获准S锁的事务只能读数据,不能更新数据。
   b.若要更新,则先要把S锁升级为X锁。
   c.另外,由于S锁只允许读数据,因此解除S锁的操作不必非要合并到事务的结束操作中去,可以随时根据需要解除S锁。
   ④实例:S锁会引起死锁。

3.封锁的相容矩阵

(1)表中事务T1先对数据作出某种封锁或不加封锁,然后事务T2再对同一数据请求某种封锁或不需封锁。
(2)表中表示它们之间是相容的还是不相容的。
(3)如果两个封锁是不相容的,那么后提出封锁的事务要等待。
4.封锁的粒度
(1)封锁对象的大小称为封锁的粒度(granularity)。
(2)封锁的对象。
   ①X锁和S锁都是加在某一个数据对象上的。
   ②封锁的对象可以是逻辑单元,也可以是物理单元。
   ③在关系数据库中,封锁对象可以是属性值、属性值集合、元组、关系、索引项、整个索引、整个数据库等逻辑单元;也可以是页(数据页或索引页)、块等物理单元。
   ④封锁对象可以很大,比如对整个数据库加锁,也可以很小,比如只对某个属性值加锁。
(3)封锁粒度与并发度的关系。
   ①封锁粒度与系统的并发度和并发控制的开销密切相关。
   ②封锁的粒度越大,并发度也就越小,但同时系统的开销也就越小。
   ③封锁的粒度越小,并发度越高,但系统开销也就越大。
(4)封锁粒度的选择。
   ①因此,在一个系统中同时存在不同大小的封锁单元供不同的事务选择使用是比较理想的。
   ②而选择封锁粒度时必须同时考虑封锁机构和并发度两个因素,对系统开销与并发度进行权衡,以求得最优的效果。
   ③一般说来,需要处理大量元组的用户事务可以以关系为封锁单元;而对于一个处理少量元组的用户事务,可以以元组为封锁单位以提高并发度。
5.封锁协议
(1)三级封锁协议。
   ①在运用封锁机制时,还需要约定一些规则,这些规则称为协议。
   ②三级封锁协议,分别在不同程度上解决了并发操作带来的各种问题,为并发操作的正确调度提供一定的保证。
(2)封锁协议的内容和优缺点。

(3)利用封锁技术,可以避免并发操作引起的各种错误,但有可能产生其它三个问题:活锁、饿死和死锁。 6.3.3 并发操作的调度
1.事务的调度、串行调度和并发调度
   事务的执行次序称为“调度”。如果多个事务依次执行,则称为事务的串行调度(Serial Schedule)。如果利用分时的方法,同时处理多个事务,则称为事务的并发调度(Concurrent Schedule)。
   数据库技术中事务的并发执行与操作系统中的多道程序设计概念类似。在事务并发执行时,有可能破坏数据库的一致性,或用户读了脏数据。
   如果有n个事务串行调度,可有n!种不同的有效调度。事务串行调度的结果都是正确的,至于依照何种次序执行,视外界环境而定,系统无法预料。
   如果有n个事务并发调度,可能的并发调度数目远远大于n!。但其中有的并发调度是正确的,有的是不正确的。如果产生正确的并发调度,是由DBMS的并发控制子系统实现的。如何判断一个并发调度是正确的,这个问题可以用下面的“并发调度的可串行化”概念解决。
2.可串行化概念
(1)定义。
   ○每个事务中,语句的先后顺序在各种调度中始终保持一致。在这个前提下,如果一个并发调度的执行结果与某一串行调度的执行结果等价,那么这个并发调度称为“可串行化的调度”,否则是不可串行化的调度。
(2)实例:事务的可串行化调度。

   ①如果先执行事务T1后执行T2,结果A的值为140;如果先执行T1后执行T1,结果A的值为170。这两种串行调度都认为是正确的,而不去管其结果是否相同。
   ②若执行结果A的值为200,与任何一个串行调度的结果都不一样,因而并发调度是不正确的,即称为是不可串行化的调度。只有并发调度执行结果为140或170时,才能认为是正确的,才是可串行化的调度。 6.3.4 SQL对并发处理的支持
1.事务的存取模式
(1)SQL2允许事务有两种模式。
   ①READ ONLY(只读型):事务对数据库的操作只能是读操作。定义这个模式后,表示随后的事务均是只读型。
   ②READ WRITE(读写型):事务对数据库的操作可以是读操作,也可以是写操作。定义这个模式后,表示随后的事务均是读写型。在程序开始时默认这种模式。
(2)这两种模式可用下列SQL语句定义。
   ①SET TRANSACTION READ ONLY
   ②SET TRANSACTION READ WRITE
2.事务的隔离级别
(1)SQL2提供事务的四种隔离级别让用户选择。这四个级别从高到低如下所述:
4种隔离级别 名称 说明 SERIALIZABLE
(可串行化) 允许事务与其他事务并发执行,但系统必须保证并发调度是可串行化,不致发生错误。在程序开始时默认这个级别。 REPEATABLE READ
(可重复读) 只允许事务读已提交的数据,并且在两次读同一数据时不允许其他事务修改此数据。 READ COMMITTED
(读提交数据) 允许事务读已提交的数据,但不要求“可重复读”。例如,事务对同一记录的两次读取之间,记录可能被已提交的事务更新。 READ UNCOMMITTED
(可以读未提交数据) 允许事务读已提交或未提交的数据。这是SQL2中所允许的最低一致性级别。 (2)上述四种级别可以用下列SQL语句定义:
   ①SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
   ②SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
   ③SET TRANSACTION ISOLATION LEVEL READ COMMITTED
   ④SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED