基于封锁的事务并发控制概述
- 格式:docx
- 大小:32.93 KB
- 文档页数:5
基于封锁的事务并发控制概述
摘要:叙述了关系型数据库管理系统中的事务管理和基于锁的事务并发控制方法。详细介绍了事务的串行化调度方法中的锁技术和锁协议,并深入讨论了锁的
管理、死锁处理、幻影问题和其它加锁过程中可能出现的一些问题。
关键词:数据库管理系统;事务;并发控制;封锁
中图分类号:TP311.131 文献标识码:A 文章编号:1007-9599 (2010) 04-0000-03
Lock-Based Transaction Concurrency Control Overview
Lu Chenglang,Xu Hupeng
(Wenzhou University,Oujiang College,Wenzhou 325035,China) Abstract:An overview on the management of lock-
based concurrency control of transactions is presented in this paper.The locking protocols and locki ng techniques of the transaction concurrency control are investigated in detail, and the approach t
o avoiding phantom problem as well as the way for handling dead-locking are discussed in depth.
Keywords:Database management systems;Transaction;Concurrency control;Lock
一、引言
事务是用户定义的一组数据库操作序列。事务的执行结果将使数据库从一个一致性状
态转变到另一个一致性状态。为了提高吞吐量,系统中常常是多个事务并发执行。这会产生
多个事务同时存取同一数据的情况,从而破坏数据库的一致性。所以数据库管理系统(Database Management System,DBMS)必须提供并发控制机制,使得并发的事务在冲突的
时候被串行化执行。这种调度称为可串行化调度。其中基于封锁的并发控制机制是一种被广
泛应用于商业DBMS中的并发控制机制。
二、事务的特性和并发的数据不一致性
事务具有ACID特性:原子性(Atomicity),一致性(Consistency),隔离性(Isolation)和持续性(Durability)。原子性指:事务包含的所有操作要么全部被执行,要么都不被执行;一致性指:事务的执行结果必须使数据库从一个一致性状态变到另一个一致性状态;隔离性指:在事务被提交以前,其操作结果对于其他事务不可见;持续性指:一旦事务成功提交,
其对数据库中数据的改变是永久的。事务是并发控制的基本单位,保证事务的ACID特性是事务处理的重要任务。然而,事务的并发执行可能会破坏事务的ACID特性,而导致数据的不一致性:
(一)Write-Write冲突,丢失更新。它是由于事务之间的写冲突造成的。两个事务
T1和T2同时读入同一数据并修改,T2的提交破坏了T1的提交结果,导致T1的修改丢失。
(二)Read-Write冲突,也称不一致读。不一致读是指事务T1读取数据后,事务T2
执行更新操作,使T1无法再现前一次读取结果。它包括三种情况:1.T1读取某一数据
后, T2对其做了修改,当T1再次读取该数据时,得到与前一次不同的值;2.T1按一定的条
件从数据库中读取了某些记录后,T2删除其中部分记录,当T1再次按相同条件读取数据时,发现某些记录神秘的消失了;3.T1按一定的条件从数据库中读取了某些记录后,T2插入了一
些记录,当T1再次按相同条件读取数据时,发现多了一些记录。后两种情况也称幻影现象。
(三)Write-Read冲突,也称读脏数据。读脏数据指事务T1修改某数据,事务T2读
取同一数据后,T1由于某种原因被撤销,这时T1已修改过的数据恢复原值,T2读到的数据
就与数据中的数据不一致,则称T2读到的数据就为脏数据。
三、基于封锁的事务并发控制机制
(一)锁的类型
封锁是实现并发控制的一个非常重要的技术。所谓封锁就是事务T在对某个数据对象
例如表,记录等操作之前,先向系统发出请求,对其加锁。加锁后事务T就对该数据对象有
了一定的控制,在事务T释放它之前,其他事务不能更新该数据对象。下面介绍DBMS涉及
的锁:
1.互斥锁(Exclusive Lock):用于写操作,又称写锁或者排他锁,记做X锁。若事务T
对数据对象A加上X锁,则只允许T读写A,其他事务都不能对A加任何锁,直到T释放A
上的锁。
2.共享锁(Shared Lock):用于读操作,又称读锁,记做S锁。若事务T对数据对象A
加上S锁,则T可读A但不能写A,其他事务只能对A加S锁,而不能加X锁,直到T释放锁。
3.更新锁(Update Lock):用于更新操作。等价于先加共享锁,在真正执行更新操作时,将共享锁升级为互斥锁。大部分DMBS 都不使用这种锁。
4.增量锁(Increment Lock):用于增量操作,如果一个对象被上了增量锁,除增量操
作以外任何读写操作都是被禁止的。即增量锁之间不排斥。因同时对某一对象的数值进行加
一或者减一操作时,其结果与操作先后顺序是无关的,可以交换。这种锁使用并不广泛。
5.意向锁(Intention Lock):它是因为引入多粒度对象而产生的,又可细分为:意向共
享锁,意向排他锁和共享意向排他锁。
在DBMS 中被广泛使用的是共享锁,互斥锁和意向锁。为了保证写操作的互斥性,不同事务对同一数据对象加锁时需要进行冲突检测。检测可以借助锁的相容矩阵来判断,如图1(a)所示。从中可以发现5种锁的强度偏序关系,如图1(b)所示。
(二)加锁管理和锁转换
DBMS中处理事务加锁事宜的部分被称为锁管理器。锁管理器维护着一个锁表,这是一
个以数据对象标志为码的哈希表。DBMS也在事务表中维护着每个事务的描述信息项,该记
录中包含一个指向事务拥有的锁列表的指针。在请求锁之前要检查这个列表,以确定不会对
同一个锁请求两次。
加锁表中的每一项针对某个数据对象(可以是一页,一条记录等等),它包括下面的
信息:拥有数据对象锁的事务数目,锁的属性(共享锁、互斥锁等)和一个指向加锁请求队
列的指针。
1.加锁和解锁请求的实现。当事务需要某个对象的锁时,需要将请求提交给锁管理器。
如果请求的是共享锁,当前请求队列为空,而且该对象没有处于互斥锁状态时,锁管理器就
将同一加锁请求,并更新该对象的相应的锁表数据项。如果请求的是互斥锁,并且没有事务
拥有该对象的锁,那么锁管理器可以同意加锁请求,并更新该对象的相应锁表数据项。对于
其它情况,加锁请求不能立刻得到满足,加锁请求将被添加到该对象的加锁请求队列中,同
时挂起请求加锁的事务。当事务中止或者提交时,会释放自己拥有的锁。当某个对象被释放时,锁管理器更新相应锁表数据项,并检查该对象的加锁请求队列。如果请求能被接受,请
求锁的事务将被唤醒并得到锁。其中,加锁和解锁操作必须是原子操作。为确保这两个操作
的原子性,锁管理器需要使用操作系统的同步机制来小心的访问锁表。
2.锁转换。事务可能需要对已经获得了共享锁的对象再请求排他锁。此时,如果没有其
他事务拥有该对象的共享锁,可以立即对事务的锁进行升级满足互斥锁请求,否则将该加锁
请求加到等待队列的最前面。但是,使用锁的升级不能避免由冲突更新操作导致的死锁。例