1、1,第4章 数据库保护,4.1 安 全 性 4.2 完 整 性 4.3 并 发 控 制 4.4 恢 复 4.5 数据库复制与数据库镜像,2,本章概要,数据库系统的特点是数据集中存放和共享,这使得数据的利用率和使用效率大大提高。但引发了数据的安全和保密问题,而且,共享使得不同用户可以在同一时刻访问数据库中的数据,并行操作使用数据库,容易引起并发冲突,破坏数据的一致性和正确性。 数据库系统中的数据由数据库管理系统统一管理和控制,因此数据库管理系统必须提供数据库安全性、完整性、并发控制、数据恢复等多方面的数据库保护功能。,3,4.1.1 安全性控制概述数据的安全性控制指防止未被授权的用户对数据库进行
2、访问,以保证数据库的数据不会由于非法使用而被泄露、更改和破坏。 非法使用数据库称为数据库的滥用。数据库的滥用分为无意滥用和恶意滥用两种。前者主要是指由已授权用户的不当操作所引起的系统故障、数据库异常等现象;而后者主要指未经授权的读取数据(即偷窃信息)和未经授权的修改数据(即破坏数据)。,4.1 安全性,4,4.1.1 安全性控制概述,要保证数据库的完整性就要避免对数据库的无意滥用,而要保证数据库的安全性则要避免对数据库的恶意滥用。可以通过在不同的安全级别上设置各种安全措施来防止数据库的恶意滥用。 环境级 职员级 操作系统级 网络级 数据库系统级:,5,安全性控制是指要尽可能地杜绝所有可能的数据
3、库非法访问。 用户非法使用数据库可以有很多种情况。例如,编写合法的程序绕过DBMS授权机制,通过操作系统直接存取、修改或备份有关数据。 用户访问非法数据,无论它们是有意的还是无意的,都应该加以严格控制,因此,系统还要考虑数据信息的流动问题并加以控制,否则有隐蔽的危险性。,4.1.2 安全性控制的一般方法,6,实际上,安全性问题并不是数据库系统所独有的,所有计算机系统中都存在这个问题。 在计算机系统中,安全措施是一级一级层层设置的,安全控制模型如图4.1所示。图4.1 安全控制模型,7,根据图4.1的安全模型,当用户进入计算机系统时,系统首先根据输入的用户标识进行身份的鉴定,只有合法的用户才准许
4、进入系统。 对已进入系统的用户,DBMS还要进行存取控制,只允许用户进行合法的操作。 DBMS是建立在操作系统之上的,安全的操作系统是数据库安全的前提。 操作系统应能保证数据库中的数据必须由DBMS访问,而不允许用户越过DBMS,直接通过操作系统访问。 数据最后可以通过密码的形式存储到数据库中。,8,1 用户标识和鉴定(Identification and Authentication) 数据库系统是不允许一个未经授权的用户对数据库进行操作的。 用户标识和鉴定是系统提供的最外层的安全保护措施,其方法是由系统提供一定的方式让用户标识自己的名字或身份,系统内部矛盾记录着所有合法用户的标识,每次用户
5、要求进入系统时,由系统进行核实,通过鉴定后才提供机器的使用权。 用户标识和鉴定的方法有多种,为了获得更强的安全性,往往是多种方法并举,常用的方法有以下几种:,9,(1)用一个用户名或用户标识符来标明用户的身份,系统以此来鉴别用户的合法性。如果正确,则可进入下一步的核实,否则,不能使用计算机。 (2)用户标识符是用户公开的标识,它不足以成为鉴别用户身份的凭证。为了进一步核实用户身份,常采用用户名与口令(Password)相结合的方法,系统通过核对口令判别用户身份的真伪。系统有一张用户口令表,为每个用户保持一个记录,包括用户名和口令两部分数据。 用户先输入用户名,然后系统要求用户输入口令。 为了保
6、密,用户在终端上输入的口令不显示在屏幕上。 系统核对口令以鉴别用户身份。 (3)通过用户名和口令来鉴定用户的方法简单易行,但该方法在使用时,由于用户名和口令的产生和使用比较简单,也容易被窃取,因此还可采用更复杂的方法。,10,例如,每个用户都预先约定好一个过程或者函数,鉴别用户身份时,系统提供一个随机数,用户根据自己预先约定的计算过程或者函数进行计算,系统根据计算结果辨别用户身份的合法性。 例如,让用户记住一个表达式,如T=X+2Y,系统告诉用户X=1,Y=2,如果用户回答T=5,则证实了该用户的身份。 当然,这是一个简单的例子,在实际使用中,还可以设计复杂的表达式,以使安全性更好。系统每次提
7、供不同的X,Y值,其他人可能看到的是X、Y的值,但不能推算出确切的变换公式T。,11,(4)智能卡技术智能卡是一种内置集成电路的芯片,芯片中存有与用户身份相关的数据,智能卡由专门的厂商通过专门的设备生产,是不可复制的硬件。智能卡由合法用户随身携带,登录时必须将智能卡插入专用的读卡器读取其中的信息,以验证用户的身份。智能卡认证通过智能卡硬件不可复制来保证用户身份不会被仿冒。为了安全起见,在使用智能卡时,许多系统要卡和身份识别码(PIN)同时使用,二者缺一不可。智能卡的优点是通过硬件保护措施和加密算法,使安全性能增加。但智能卡需专用设备读取,同时从智能卡中读取的数据是静态的,外界通过内存扫描或网络
8、监听等技术可能会截取到用户的身份验证信息,因此还存在安全隐患。,12,(5)主体特征鉴别主体认证技术以人体唯一的、可靠的、稳定的生物特征(如指纹、虹膜、脸部、掌纹等)为依据,采用计算机的强大网络功能和网络技术进行图像处理和模式识别的。与传统的身份认证手段相比,主体特征鉴别技术的优点是在安全性、可靠性和有效性上产生了质的飞跃,适合安全级别较高的场所;其缺点是生物特征信息采集、认证装备的成本较高,人身特征识别软件识别率有待提高。,13,2 用户存取权限控制 用户存取权限指的是不同的用户对于不同的数据对象允许执行的操作权限。 在数据库系统中,每个用户只能访问他有权存取的数据并执行有权使用的操作。 因
9、此,必须预先定义用户的存取权限。 对于合法的用户,系统根据其存取权限的定义对其各种操作请求进行控制,确保合法操作。 存取权限由两个要素组成,数据对象和操作类型。 定义一个用户的存取权限就是要定义这个用户可以在哪些数据对象上进行哪些类型的操作。,14,在数据库系统中,定义用户存取权限称为授权(Authorization)。 授权有两种:系统特权和对象特权。 系统特权是由DBA授予某些数据库用户,只有得到系统特权,才能成为数据库用户。 对象特权可以由DBA授予,也可以由数据对象的创建者授予,使数据库用户具有对某些数据对象进行某些操作的特权。 在系统初始化时,系统中至少有一个具有DBA特权的用户,D
10、BA可以通过GRANT语句将系统特权或对象特权授予其他用户。 对于已授权的用户可以通过REVOKE语句收回所授予的特权。,15,这些授权定义经过编译后以一张授权表的形式存放在数据字典中。 授权表主要有三个属性,用户标识、数据对象和操作类型。 用户标识不但可以是用户个人,也可以是团体、程序和终端。在非关系系统中,存取控制的数据对象仅限于数据本身。 而关系系统中,存取控制的数据对象不仅有基本表、属性列等数据本身,还有内模式、外模式、模式等数据字典中的内容。 (1)关系系统中的存取权限。,16,(2)数据库用户的种类, 具有数据库登录权限的用户该类用户可进入数据库系统,但只能根据授权,创建视图或定义
11、数据别名,查阅部分数据库信息,不能改动数据库中的任何数据。 具有资源管理权限的用户 具有资源管理权限的用户,除了拥有上一类的用户权限外,还有创建数据库表、索引和聚簇的权限;可以在权限允许的范围内修改、查询数据库;能将自己拥有的权限授予其他用户;可以跟踪审计(audit)自己所创建的数据对象。 具有数据库管理员权限的用户 具有数据库管理员权限的用户具有数据库管理的一切权限,包括访问任何用户的任何数据,授予(或回收)用户的各种权限,创建各种数据库实体,完成数据库的整库备份、装入重组以及进行全系统的审计等工作。,17,(3)存取机制的构成, 授权(Authorization),定义用户权限,并将用户
12、权限登记到数据字典中。 验证(Authentication),当用户提出操作请求时,系统进行权限检查,拒绝用户的非法操作。 在数据库系统中要预先定义用户的存取权限以保证数据只能被有权限的用户访问。这些存取权限定义经过编译后存放在数据字典里,称作安全规则或授权规则。用户权限定义指明了用户可操作的数据对象及操作类型。存取权限检查则检查用户执行数据库操作的合法性,即根据其存取权限定义对用户的各种操作请求进行控制,确保用户只执行合法操作。 授权和验证机制一起组成了DBMS的安全子系统。,18,自主存取控制,同一用户对于不同的数据对象有不同的存取权限 不同的用户对同一对象也有不同的权限 用户还可将其拥有
13、的存取权限转授给其他用户,19,强制存取控制方法,每一个数据对象被标以一定的密级 每一个用户也被授予某一个级别的许可证 对于任意一个对象,只有具有合法许可证的用户才可以存取,20,(4)DAC和MAC共同构成的安全机制,DBMS在执行安全性检查时,首先进行DAC检查,然后对通过检查的且具有访问许可的数据对象进行MAC检查。只有通过MAC检查的数据对象才可以进行访问。因此,在实现MAC之前要先实现DAC,即DAC与MAC共同构成DBMS的安全机制,如图所示。,21,3 定义视图 为不同的用户定义不同的视图,可以限制各个用户的访问范围。 通过视图机制把要保密的数据对无权存取这些数据的用户隐藏起来,
14、从而自动地对数据提供一定程度的安全保护。例如,USER1只能对计算机系的学生进行操作, 一种方法是通过授权机制对USER1授权,如表4.5所示, 另一种简单的方法就是定义一个计算机系的视图。 但视图机制的安全保护功能太不精细,往往不能达到应用系统的要求,其主要功能在于提供了数据库的逻辑独立性。 在实际应用中,通常将视图机制与授权机制结合起来使用,首先用视图机制屏蔽一部分保密数据,然后在视图上面再进一步定义存取权限。,22,4审计(Auditing) 审计是一种监视措施,用于跟踪和记录所选用户的对数据库的操作。通过审计可以跟踪、记录可疑的数据库操作,并将跟踪的结果记录在审计日志(Audit Lo
15、g)中,根据审计日志记录可对非法访问进行事后分析和调查。 审计日志中记录一般包括下列内容:操作类型(如查询、修改等)、操作终端标识与操作员标识、操作日期和时间、操作的数据对象(如表、记录、视图、属性等)及数据修改前后的值。这样数据库管理员可以利用审计跟踪的信息,重现导致数据库现有状况的一系列事件,找出非法存取数据的人、时间、内容等。 通常进行审计时,时间和空间的消耗都很大,所以DBMS一般都将其作为可选设置,允许数据库管理员根据应用对安全性的要求,灵活地打开/关闭审计功能。,23,5 数据加密(Data Encryption) 前面介绍的几种数据库安全措施,都是防止从数据库系统窃取保密数据,不
16、能防止通过不正常渠道非法访问数据,例如,偷取存储数据的磁盘,或在通信线路上窃取数据,为了防止这些窃密活动,比较好的办法是对数据加密。 数据加密是防止数据库中数据在存储和传输中失密的有效手段。 加密的基本思想是根据一定的算法将原始数据(术语为明文,Plain text)加密成为不可直接识别的格式(术语为密文,Clipher text),数据以密码的形式存储和传输。,24,加密方法有两种, 一种是替换方法,该方法使用密钥(Encryption Key)将明文中的每一个字符转换为密文中的一个字符。 另一种是转换方法,该方法将明文中的字符按不同的顺序重新排列。 通常将这两种方法结合起来使用,就可以达到
17、相当高的安全程度。 例如美国1977年制定的官方加密标准,数据加密标准(Data Encryption Standard,简称DES)就是使用这种算法的例子。 数据加密后,对于不知道解密算法的人,即使利用系统安全措施的漏洞非法访问数据,也只能看到一些无法辨认的二进制代码。 合法的用户检索数据时,首先提供密码钥匙,由系统进行译码后,才能得到可识别的数据。,25,目前不少数据库产品提供了数据加密例行程序,用户可根据要求自行进行加密处理,还有一些未提供加密程序的产品也提供了相应的接口,通话用户用其他厂商的加密程序对数据加密。 用密码存储数据,在存入时需加密,在查询时需解密,这个过程会占用大量系统资源
18、,降低了数据库的性能。 因此数据加密功能通常允许用户自由选择,只对那些保密要求特别高的数据,才值得采用此方法。,26,数据库的完整性和安全性是数据库保护的两个不同的方面。 安全性是保护数据库,以防止非法使用所造成数据的泄露、更改或破坏,安全性措施的防范对象是非法用户和非法操作; 完整性是防止合法用户使用数据库时向数据库中加入不符合语义的数据,完整性措施的防范对象是不合语义的数据。 但从数据库的安全保护角度来讲,安全性和完整性又是密切相关的。,4.2 完整性,27,4.2.1 完整性约束的分类,1静态列级约束 2静态元组级约束 3静态表级约束 4动态列级约束 5动态元组约束 6动态关系约束 7D
19、BMS中提供的完整性约束,28,4.2.2 完整性控制完整性控制包括完整性约束条件定义机制、完整性检查机制和违约反应三部分。 (1)完整性约束条件定义机制 完整性约束条件是数据模型的一个重要组成部分,它约束了数据库中数据的语义。DBMS应给用户提供根据现实世界的语义定义数据库的约束条件的手段,并允许用户把这些完整性约束条件作为模式的一部分存入数据库中。 (2)完整性检查机制 完整性检查机制检查用户发出的操作请求是否违背了完整性约束条件。 (3)违约反应 违约反应保证了在发现用户的操作请求使数据违背了完整性约束条件后,采取一定的动作(如拒绝该操作)来保证数据的完整性。,29,完整性规则从执行时间
20、上可分为立即执行约束(Immediate Constraints)和延迟执行约束(Deferred Constrainsts)。 立即执行约束是指在执行用户事务过程中,某一条语句执行完成后,系统立即对此数据进行完整性约束条件检查。 延迟执行约束是指在整个事务执行结束后,再对约束条件进行完整性检查,结果正确后才能提交。 某一条语句执行完成后,系统立即对此数据进行完整性约束条件检查。,2立即执行约束和延迟执行约束,30,例如,银行数据库中“借贷总金额应平衡”的约束就应该属于延迟执行约束,从账号A转一笔钱到账号B为一个事务,从账号A转出去钱后,账就不平了,必须等转入账号B后,账才能重新平衡,这时才能
21、进行完整性检查。 如果发现用户操作请求违背了立即执行约束,则可以拒绝该操作,以保护数据的完整性。 如果发现用户操作请求违背了延迟执行约束,而又不知道是哪个事务的操作破坏了完整性,则只能拒绝整个事务,把数据库恢复到该事务执行前的状态。,31,3实现参照完整性应解决的问题,(1) 外码能否接受空值问题 (2) 在被参照关系中删除元组的问题 步级联删除(CASCADES) 受限删除(RESTRICTED) 置空值删除(NULLIFIES) (3)在参照关系中插入元组时的问题 受限插入 递归插入 (4)修改关系中主码的问题 不允许修改主码 允许修改主码,32,数据库并发性的含义完整性是保证各个事务本身
22、能得到正确的数据,只考虑一个用户使用数据库的情况,但实际上数据库中有许多用户。每个用户在存取数据库中的数据时,可能是串行执行,即每个时刻只有一个用户程序运行,也可能是多个用户并行地存取数据库。数据库的最大特点之一就是数据资源是共享的,串行执行意味着一个用户在运行程序时,其他用户程序必须等到这个用户程序结束才能对数据库进行存取,这样如果一个用户程序涉及大量数据的输入/输出交换,则数据库系统的大部分时间将处于闲置状态。,4.3 并发控制,33,因此,为了充分利用数据库资源,很多时候数据库用户都是对数据库系统并行存取数据,这样就会发生多个用户并发存取同一数据块的情况,如果对并发操作不加控制可能会产生
23、不正确的数据,破坏数据的完整性,并发控制就是解决这类问题,以保持数据库中数据的一致性,即在任何一个时刻数据库都将以相同的形式给用户提供数据。,34,1事务(Transaction) 事务(Transaction)是数据库的逻辑工作单元,它是一组对数据操作的序列,这些操作要么全做要么全不做。事务是并发控制的基本单位。 事务是由有限的数据库操作序列组成,但并不是任意的数据库操作序列都能成为事务,为了保护数据的完整性,一般要求事务具有以下四个特征: 原子性 一致性 隔离性 持续性,4.3.1 并发控制概述,35, 原子性(Atomicity),即一个事务是不可分割的数据库逻辑工作单位。 一致性(Co
24、nsistency),事务的执行结果必须使数据库从一个一致性状态变到另一个一致性状态。 隔离性(Isolation),一个事务的执行不能被其他事务干扰。 持续性(Durability),持续性也称为永久性,指一个事务一旦提交,它对数据库中数据的改变应该是永久性的,其他操作或故障不对其产生任何影响。 事务上述四个性质的英文术语的第一个字母为ACID。因此,这四个性质以称为事务的ACID准则。,事务的特征,36,2事务的状态,一般将事务的执行状态分为5种,事务必须处于这5种状态之一。 活动状态:事务的初始状态,事务执行时处于这个状态。 部分提交状态:当操作序列的最后一条语句自动执行后,事务处于部分
25、提交状态。这时,事务虽然已经完全执行,但由于实际输出可能还驻留在内存中,而在事务成功完成前仍有可能出现硬件故障,事务仍可能不得不中止。因此,事务处于部分提交状态不表示事务成功执行。 失败状态:由于硬件或逻辑等错误,使得事务不能继续正常执行,事务就进入了失败状态,处于失败状态的事务必须回滚(ROLLBACK)。这样,事务就进入了中止状态。 中止状态:事务回滚并且数据库恢复到事务开始执行前的状态。 提交状态:当事务成功完成后,称事务处于提交状态(COMMIT)。,37,3SQL中的事务定义,在SQL中定义事务的语句有BEGIN TRANSACTION、COMMIT、ROLLBACK。事务以BEGI
26、N TRANSACTION语句开始,以COMMIT(事务提交)或ROLLBACK(回滚)结束。提交即提交事务的所有操作,将事务中所有对数据库的更新写回到物理数据库,事务正常结束。回滚表示在事务运行中发生了某种故障,事务不能继续执行,系统将事务中对数据库已完成的所有操作(指更新操作)全部撤销,回滚到事务开始时的状态。,38,下面是一个事务的例子,从帐号A转移资金额R到帐号B: BEGIN TRANSACTIONREAD AAA-RIF A0 /* A 款不足*/THENBEGINDISPLAY “A款不足”ROLLBACKEND ELSE /* 拨款 */BEGINBB+RDISPLAY “拨款
27、完成”COMMITEND,39,这是对一个简单事务的完整的描述。 该事务有两个出口: 当A 帐号的款项不足时,事务以ROLLBACK(撤销)命令结束,即撤销该事务的影响; 另一个出口是以COMMIT(提交)命令结束,完成从帐号A到帐号B的拨款。 在COMMIT之前,即在数据库修改过程中,数据可能是不一致的,事务本身也可能被撤销。 只有在COMMIT之后,事务对数据库所产生的变化才对其他事务开放,这就可以避免其他事务访问不一致或不存在的数据。,40,4事务的调度的一般概念,(1)调度(schedule) (2)串行调度(serial schedule) (3)并行调度(concurrent sc
28、hedule) 交叉并发方式(interleaved concurrency),指在单处理机系统中,多个并行事务的操作轮流交叉运行,从而减少处理机的空闲时间,提高系统的效率。 多处理机系统中,每个处理机可以运行一个事务,多个处理机可以同时运行多个事务,实现多个事务真正的并行运行。这是最理想的并发方式,但对于硬件环境要全较高。,41,5并发所引起的问题 当同一数据库系统中有多个事务并发运行时,如果不加以适当控制,可能产生数据的不一致性。例1并发取款操作。假设存款余额R=1000元,甲事务T1取走存款100元,乙事务T2取走存款200元,如果正常操作,即甲事务T1执行完毕再执行乙事务T2,存款余额
29、更新后应该是700元。但是如果按照如下顺序操作,则会有不同的结果: 甲事务T1读取存款余额R =1000元; 乙事务T2读取存款余额R =1000元; 甲事务T1取走存款100元,修改存款余额R =R 100=900,把R =900写回到数据库; 乙事务T2取走存款200元,修改存款余额R =R 200=800,把R =800写回到数据库。,42,结果两个事务共取走存款300元,而数据库中的存款却只少了200元。 得到这种错误的结果是由甲乙两个事务并发操作引起的,数据库的并发操作导致的数据库不一致性主要有以下三种: (1)丢失更新(Lost Update) 当两个事务T1和T2读入同一数据做修
30、改,并发执行时, T2把T1或T1把T2的修改结果覆盖掉,,43,造成了数据的丢失更新问题,导致数据的不一致。 仍以例中的操作为例进行分析。 在表4.1中,数据库中R的初值是1000,事务T1包含三个操作:读入R初值(FIND R);计算(R=R-100);更新R(UPDATE R)。 事务T2也包含三个操作:FIND R;计算(R=R-200);UPDATE R。 如果事务T1和T2顺序执行,则更新后,R的值是700。但如果T1和T2按照表4.1所示的并发执行,R的值是800,得到错误的结果,原因在于在t7时刻丢失了T1对数据库的更新操作。 因此,这个并发操作不正确。,44,表4.1 丢失更
31、新问题,45,(2)脏读(Dirty Read) 事务T1更新了数据R,事务T2读取了更新后的数据R,事务T1由于某种原因被撤消,修改无效,数据R恢复原值。事务T2得到的数据与数据库的内容不一致,这种情况称为“污读”。 在表4.2中,事务T1把R的值改为900,但此时尚未做COMMIT操作,事务T2将修改过的值900读出来,之后事务T1执行ROLLBACK操作,R的值恢复为1000,而事务T2将仍在使用已被撤消了的R值900。 原因在于在t4时刻事务T2读取了T1未提交的更新操作结果,这种值是不稳定的,在事务T1结束前随时可能执行ROLLBACK操作。 对于这些未提交的随后又被撤消的更新数据称
32、为“脏数据”。 比如,这里事务T2在t2时刻读取的就是“脏数据”。,46,表4.2 污读问题,47,(3)不可重读(Unrepeatable Read) 事务T1读取了数据R,事务T2读取并更新了数据R,当事务T1再读取数据R以进行核对时,得到的两次读取值不一致,这种情况称为“不可重读”。 在表4.3中,在t0时刻事务T1读取R的值为1000,但事务T2在t4时刻将R的值更新为为800。所以T1所使用的值已经与开始读取的值不一致。,表4.3 不可重读问题,48,并发操作之所以会产生错误,是因为任务执行期间相互干扰,破坏了事务的隔离性造成的。在将任务定义成事务,事务具有的特性(特别是隔离性)得以
33、保证时,就能避免上述错误的发生。但是,如果只允许事务串行操作又会降低系统的效率。所以,多数DBMS采用事务机制和封锁机制进行并发控制,既保证了数据的一致性,又保障了系统效率 并发控制就是要求DBMS提供并发控制功能以正确的方式高度并发事务,避免并发事务之间的相互干扰造成数据的不一致性,保证数据库的完整性。,49,1调度策略对事务并发操作的影响 如果有两个事务T1、T2分别对数据X,Y进行赋值操作,由于事务的不同调度,引起了不同的结果,如图所示。已知X,Y的初值均为0。,4.3.2 并发操作的调度,50,2将所有事务串行起来的调度策略一定是正确的调度策略,定义4.1 多个事务的并发执行是正确的,
34、当且仅当其结果与按某一次序串行地执行它们时的结果相同,我们称这种调度策略为可串行化(Serializable)的调度。 可串行性(Serializability)是并发事务正确性的准则。按这个准则规定,一个给定的并发调度,当且仅当它是可串行化的,才认为是正确调度。 为了保证并发操作的正确性,DBMS的并发控制机制必须提供一定的手段来保证调度是可串行化的。目前DBMS普遍采用封锁方法实现并发操作调度的可串行性,从而保证调度的正确性。,51,1封锁及锁的类型 所谓封锁就是当一个事务在对某个数据对象(可以是数据项、记录、数据集、以至整个数据库)进行操作之前,必须获得相应的锁,以保证数据操作的正确性和
35、一致性。 封锁的3个环节:申请加锁,获得锁,释放锁。 基本的封锁类型有2种:排它锁(Exclusive Locks,也称X锁)和共享锁(Share Locks,也称S锁)。,4.3.3 封锁,52,排它锁(Exclusive Lock) 排它锁又称写锁,简称为X锁,其采用的原理是禁止并发操作。 当事务T对某个数据对象R实现X封锁后,其他事务要等T解除X封锁以后,才能对R进行封锁。这就保证了其他事务在T释放R上的锁之前,不能再对R进行操作。 共享锁(Share Lock) 共享锁又称读锁,,简称为S锁,其采用的原理是允许其他用户对同一数据对象进行查询,但不能对该数据对象进行修改。 当事务T对某个
36、数据对象R实现S封锁后,其他事务只能对R加S锁,而不能加X锁,直到T释放R上的S锁。 这就保证了其他事务在T释放R上的S锁之前,只能读取R,而不能再对R作任何修改。,53,2 锁协议(Lock Protocol) 封锁可以保证合理的进行并发控制,保证数据的一致性。 实际上,锁是一个控制块,其中包括被加锁记录的标识符及持有锁的事务的标识符等。 在封锁时,要考虑一定的封锁规则,例如,何时开始封锁、封锁多长时间、何时释放等,这些封锁规则称为封锁协议。 对封锁方式规定不同的规则,就形成了各种不同的封锁协议。 封锁协议在不同程序上对正确控制并发操作提供了一定的保证。 上面讲述过的并发操作所带来的丢失更新
37、、污读和不可重读等到数据不一致性问题,可以通过三级封锁协议在不同程度上给予解决,下面介绍三级封锁协议。,54,一级封锁协议 一级封锁协议的内容是:事务T在修改数据对象之前必须对其加X锁,直到事务结束。 具体地说,就是任何企图更新记录R的事务必须先执行“XLOCK R”操作,以获得对该记录进行寻址的能力并对它取得X封锁。 如果未获准“X 封锁”,那么这个事务进入等待状态,一直到获准“X封锁”,该事务才继续做下去。 该事务规定事务在更新记录R时必须获得排它性封锁,使得两个同时要求更新R的并行事务之一必须在一个事务更新操作执行完成之后才能获得X封锁,这样就避免了两个事务读到同一个R值而先后更新时所发
38、生的丢失更新问题。,55,利用一级封锁协议可以解决表4.5中的数据丢失更新问题,如表4.4所示。 事务T1先对R进行X封锁(XLOCK),事务T2执行“XLOCK R”操作,未获准“X封锁”,则进入等待状态,直到事务T1更新R值以后,解除X封锁操作(UNLOCK X)。 此后事务T2再执行“XLOCK R”操作,获准“X封锁”,并对R值进行更新(此时R已是事务T1更新过的值,R=900)。 这样就能得出正确的结果。,56,表4.4 无丢失更新问题,57,一级封锁协议只有当修改数据时才进行加锁,如果只是读取数据并不加锁,所以它不能防止“脏读”和“重读”数据。 二级封锁协议 二级封锁协议的内容是:
39、在一级封锁协议的基础上,另外加上事务T在读取数据R之前必须先对其加S锁,读完后释放S锁。 所以二级封锁协议不但可以解决更新时所发生的数据丢失问题,还可以进一步防止“脏读”。 利用二级封锁协议可以解决表4.2中的数据“脏读”问题,如表4.5所示。 事务T1先对R进行X封锁(XLOCK),把R的值改为900,但尚未提交。这时事务T2请求对数据R加S锁,因为T1已对R加了X锁,T2只能等待,直到事务T1释放X锁。,58,之后事务T1因某种原因撤销,数据R恢复原值1000,并释放R上的X锁。事务T2可对数据R加S锁,读取R=1000,得到了正确的结果,从而避免了事务T2读取“脏数据”。,表4.5 无脏
40、读问题,59,二级封锁协议在读取数据之后,立即释放S锁,所以它仍然不能防止“重读”数据。 三级封锁协议 三级封锁协议的内容是:在一级封锁协议的基础上,另外加上事务T在读取数据R之前必须先对其加S锁,读完后并不释放S锁,而直到事务T结束才释放。 所以三级封锁协议除了可以防止更新丢失问题和“污读”数据外,还可进一步防止不可重读数据,彻底解决了并发操作所带来的三个不一致性问题。 利用三级封锁协议可以解决表4.3中的不可重读问题,如表4.6所示。,60,在表4.6中,事务T1读取R的值之前先对其加S锁,这样其他事务只能对R加S锁,而不能加X锁,即其他事务只能读取R,而不能对R进行修改。 所以当事务T2
41、在t3时刻申请对R加X锁时被拒绝,使其无法执行修改操作,只能等待事务T1释放R上的S锁,这时事务T1再读取数据R进行核对时,得到的值仍是1000,与开始所读取的数据是一致的,即可重读。 在事务T1释放S锁后,事务T2可以对R加X锁,进行更新操作,这样便保证了数据的一致性。,61,表4.6 可重读问题,62,3两段锁协议,两段锁协议是保证调度可串行性的协议,该协议要求所有事务必须分两个阶段对数据项加锁和解锁。 扩展阶段:在对任何数据进行读、写操作之前,首先要申请并获得对该数据的封锁。 收缩阶段:在释放一个封锁之后,事务不再申请和获得任何其他封锁。,63,4 封锁的粒度(Lock Granular
42、ity) 封锁粒度指封锁的单位。 根据对数据的不同处理,封锁的对象可以是这样一些逻辑单元:字段、记录、表、数据库等。 封锁粒度与系统的并发度和并发控制的开销密切相关。 封锁粒度越小,系统中能够被封锁的对象就越多,并发度越高,但封锁机构复杂,系统开销也就越大。相反,封锁粒度越大,系统中能够被封锁的对象就越少,并发度越小,封锁机构简单,相应系统开销也就越小。 因此,在实际应用中,选择封锁粒度时应同时考虑封锁机构和并发度两个因素,对系统开销与并发度进行权衡,以求得最优的效果。 由于同时封锁一个记录的概率很小,一般数据库系统都在记录级上进行封锁,以获得更高的并发度。,64,4.3.4 死锁和活锁 封锁
43、技术可有效解决并行操作的一致性问题,但也可产生新的问题,即活锁和死锁问题。 1活锁(Livelock) 当某个事务请求对某一数据的排它性封锁时,由于其他事务对该数据的操作而使这个事务处于永久等待状态,这种状态称为活锁。 例如,事务T1在对数据R封锁后,事务T2又请求封锁R,于是T2等待。T3也请求封锁R。当T1释放了R上的封锁后首先批准了T3的请求,T2继续等待。然后又有又T4请求封锁R,T3释放了R上的封锁后又批准了T4的请求T2可能永远处于等待状态,从而发生了活锁。如表4.7所示。,65,表4.7 活锁,66,避免活锁的简单方法是采用先来先服务的策略,按照请求封锁的次序对事务排队,一旦记录
44、上的锁释放,就使申请队列中的第一个事务获得锁。 有关活锁的问题我们不再详细讨论,因为死锁的问题较为常见,这里主要讨论有关死锁的问题。2死锁(Deadlock) 在同时处于等待状态的两个或多个事务中,其中的每一个在它能够进行之前,都等待着某个数据、而这个数据已被它们中的某个事务所封锁,这种状态称为死锁。 例如,事务T1在对数据R1封锁后,又要求对数据R2封锁,而事务T2已获得对数据R2的封锁,又要求对数据R1封锁,这样两个事务由于都不能得到封锁而处于等待状态,发生了死锁。如表4.8所示。,67,表4.8 死锁,68,3死锁的预防 死锁一旦发生,系统效率将会大大下降,因而要尽量避免死锁的发生。 在
45、操作系统的多道程序运行中,由于多个进程的并行执行需要分别占用不同资源时,也会发生死锁。 要想预防死锁的产生,就得破坏形成死锁的条件。 同操作系统预防死锁的方法类似,在数据库环境下,常用的方法有以下两种: (1)一次封锁法 一次加锁法是每个事物必须将所有要使用的数据对象全部依次加锁,并要求加锁成功,只要一个加锁不成功,表示本次加锁失败,则应该立即释放所有已加锁成功的数据对象,然后重新开始从头加锁。 一次加锁法的程序框图如下图。,69,(1)一次封锁法,70,如表4.8发生死锁的例子,可以通过一次加锁法加以预防。 事务T1启动后,立即对数据R1和R2依次加锁,加锁成功后,执行T1,而事务T2等待。
46、 直到T1执行完后释放R1和R2上的锁,T2继续执行。这样就不会发生死锁。 一次加锁法虽然可以有效地预防死锁的发生,但也存在一些问题。 首先,对某一事务所要使用的全部数据一次性加锁,扩大了封锁的范围,从而降低了系统的并发度。 其次,数据库中的数据是不断变化的,原来不要求封锁的数据,在执行过程中可能会变成封锁对象,所以很难事先精确地确定每个事务所要封锁的数据对象,这样只能在开始扩大封锁范围,将可能要封锁的数据全部加锁,这就进一步降低了并发度,影响了系统的运行效率。,71,(2)顺序封锁法 顺序加锁法是预先对所有可加锁的数据对象规定一个加锁顺序,每个事务都需要按此顺序加锁,在释放时,按逆序进行。
47、例如对于表4.8发生的死锁,我们可以规定封锁顺序为R1、R2,事务T1和T2都需要按此顺序加锁。T1先封锁R1,再封锁R2。当T2再请求封锁R1时,因为T1已经对R1加锁,T2只能等待。待T1释放R1后,T2再封锁R1,则不会发生死锁。 顺序加锁法同一次加锁法一样,也存在一些问题。因为事务的封锁请求可以随着事务的执行而动态地决定,所以很难事先确定封锁对象,从而更难确定封锁顺序。即使确定了封锁顺序,随着数据操作的不断变化,维护这些数据的封锁顺序要需要很大的系统开销。,72,在数据库系统中,由于可加锁的目标集合不但很大,而且是动态变化的; 可加锁的目标常常不是按名寻址,而是按内容寻址,预防死锁常要
48、付出很高的代价,因而上述两种在操作系统中广泛使用的预防死锁的方法并不很适合数据库的特点。 一般情况下,在数据库系统中,可以允许发生死锁,在死锁发生后可以自动诊断并解除死锁。,73,4死锁的诊断与解除 数据库系统中诊断死锁的方法与操作系统类似。 (1)超时法 如果一个事务的等待时间超过了规定的时限,就认为发生了死锁。超时后的事务自己回滚并重启。如果确实存在死锁,则卷入死锁的一个或多个事务将超时并回滚,从而使其他事务继续。(2)等待图法 事务等待图是一个有向图G=(T,U)。T为结点的集合,每个结点表示正运行的事务;U为边的集合,每条边表示事务等待的情况。若T1等待T2,则T1,T2之间画一条T1
49、指向T2的有向边。事务等待图动态地反映了所有事务的等待情况。并发控制子系统周期性地(比如每隔1分钟)检测事务等待图,如果发现图中存在回路,则表示系统中出现了死锁。,74,DBMS的并发控制子系统一旦检测到系统中存在死锁,就要设法解除。通常采用的方法是选择一个处理死锁代价最小的事务,将其撤销,释放此事务持有的所有的锁,使其他事务得以继续运行下去。当然,对撤销的事务所执行的数据修改操作必须加以恢复。,75,数据库恢复的含义 虽然数据库系统中已采取一定的措施,来防止数据库的安全性和完整性的破坏,保证并发事务的正确执行,但数据库中的数据仍然无法保证绝对不遭受破坏,比如计算机系统中硬件的故障、软件的的错
50、误,操作员的失误,恶意的破坏等都有可能发生,这些故障的发生影响数据库数据的正确性,甚至可能破坏数据库,使数据库中的数据全部或部分丢失。 因此,系统必须具有检测故障并把数据从错误状态中恢复到某一正确状态的功能,这就是数据库的恢复。,4.4 恢复,76,4.4.1 恢复的原理,1故障的种类 (1)事务内部的故障 事务故障表示由非预期的、不正常的程序结束所造成的故障。 造成程序非正常结束的原因包括输入数据错误、运算溢出、违反存储保护、并行事务发生死锁等。 发生事务故障时,被迫中断的事务可能已对数据库进行了修改,为了消除该事务对数据库的影响,要利用日志文件中所记载的信息,强行回滚(ROLLBACK)该事务,将数据库恢复到修改前的初始状态。,