您好,欢迎访问三七文档
1第8章数据库保护为了保证数据库中数据的安全可靠和正确有效,DBMS必须提供一套有效的数据保护功能。数据保护包括数据的安全性、完整性、并发控制和故障恢复。数据库的一个显著特点是数据的共享,各个事务程序都可以访问数据库中的数据。如果各个事务串行工作,即一个事务执行结束后才开始另一个事务,情况就简单多了。但如果多个事务并行工作,即同时有几个事务在执行,情况就比较复杂,因为并行工作的各个事务可能会造成数据库中数据的不一致。也会引起其它一些意外情况的发生。保证数据库的安全性与完整性的各种措施,并不能避免因各种意外情况,如硬件故障、操作失误甚至人为的恶意破坏,所造成的事务的非正常中断而导致数据库中数据的丢失。所以必须有安全措施能恢复数据库到一个已知的正确状态。数据库中数据的完整性保护,由DBMS提供的完整性检查机制来实现。该机制会自动检查数据库中数据,看其是否符合完整性约束条件。完整性约束条件作为数据库模式的一部分存储在数据库中。有关这方面的内容,前已述及。本章将学习数据库保护中有关并发控制、故障恢复和安全性等方面的内容。本章内容:8.1并发控制8.1.1并发可能出现的问题8.1.2封锁(Locking)8.1.3三级封锁协议8.1.4加锁请求的选择策略和活锁8.1.5死锁8.1.6并发调度的可串行性8.1.7两段封锁协议8.1.8多粒度封锁8.1.9意向锁8.2数据库恢复技术8.2.1故障的种类8.2.2故障恢复的手段8.2.3恢复方法8.3数据库安全8.3.1用户标识和监别8.3.2访问控制8.3.3强制存取控制方法8.3.4视图和查询修改8.3.5跟踪审计8.3.6数据加密8.1并发控制•串行访问(serialaccess):事务都是顺序执行的,即一个事务结束后才能运行另一事务。2•并行访问(concurrentaccess):多个事务同时执行。交叉并发(interleavedconcurrency)单CPU系统中,多个事务交叉使用CPU同时并发(simaltaneousconcurrency)多CPU系统中,多个事务同时占用CPU•并发操作的两个好处:提高系统的资源利用率。一个事务在不同的执行阶段需要的系统资源是不同的,CPU、通信、输入设备、…。串行工作会造成资源空闲。并发执行可以交叉使用各种资源,提高资源利用率。改善短事务的响应时间。两个事务T1和T2,T1执行时间较长,T2所需时间很短。串行执行时若T1比T2稍早执行,则T2要等很长时间才能得到响应。而在并发情况下,T2可与T1并发执行,响应时间明显缩短。8.1.1并发可能出现的问题•不加控制的并发操作,可能引起数据的不一致性有:丢失更新、读脏数据和不可重复读。以上三种数据不一致性产生的原因在于:一个事务未执行完时,就开始执行另一事务了。如果一个事务在修改数据时,其他事务不得修改同一数据,就不会产生丢失更新的情况;如果一个事务在更新数据时,其他事务不得读取该数据,则不会产生读脏数据的情况,也不会产生不可重复读的情况。这就是封锁(Locking)的目的。8.1.2封锁(Locking)封锁是实现并发控制的一个非常重要的技术。封锁可避免并发操作可能出现的问题。某事务在对某数据对象(如:表、记录等)执行操作前,首先必须对此对象加上自己的锁。•读A=10•读A=10•A=A+100写回A=110•A=A+100写回A=110T1T2a.丢失修改(更新)LostUpdate•读B=20B=B+100写回B=120•读B=120•ROLLBACKB=20T1T2b.读脏数据DirtyRead•读C=30•读C=30C=C+100写回C=130•读C=130T1T2c.不可重复读Non-RepeatableRead3加锁成功后,才能执行相应的操作,而此时其他事务对该对象的操作就受到了规定的限制。该事务完成自己的操作之后,必须把先前加上的锁撤销,以便使其他事务可以执行各自的操作。锁的基本类型有两种:排它锁(ExclusiveLock,简称X锁、写锁)共享锁(ShareLock,简称S锁、读锁)8.1.3三级封锁协议•对数据对象加锁时,还需要约定一些封锁规则:如何时能申请加锁、持锁的时间、何时才能释放锁等。约定的这些加锁规则称为封锁协议(LockingProtocol)。对封锁方式规定不同的规则,就形成了各种不同的封锁协议。下面学习三级封锁协议:•一级封锁协议:任一事务在修改某数据之前,必须先对其加上自己的X锁,直至事务结束后才能释放之。事务结束包括正常结束(Commit)和非正常结束(Rollback)。在一级封锁协议中,如果仅仅是读数据而不对其进行修改,是不需要加锁的。所以一级封锁协议解决了丢失修改问题,但不能保证可重复讯和不读“脏”数据。•二级封锁协议,内容包括:一级封锁协议;任一事务在读取某数据前,必须先对其加上S锁,读完后即可释放S锁;二级封锁协议既可防止数据丢失修改,又可防止读“脏”数据,但不能保证可重复读。•三级封锁协议,内容包括:一级封锁协议;任一事务在读取某数据前,必须先对其加上S锁,直至事务结束才释放此S锁;YYNSYNNXNoneSXT1T2N:不相容的请求,Y:相容的请求封锁相容矩阵NoneYY4三级封锁协议既可防止数据丢失修改和读“脏”数据问题的发生,又能保证数据的可重复读。用封锁机制解决三种数据不一致性的示例8.1.4加锁请求的选择策略和活锁当一个数据对象R已被一个事务T封锁时,其他任何事务对该数据R进行封锁的请求只能等待。直至T释放了对R的封锁后,系统才会执行其他事务对R进行封锁的请求。但是,如果有多个事务都在等待对R封锁,该选择哪个事务的封锁请求呢?这就要求有一个合适的选择策略。如果选择策略不合理的话,就有可能产生活锁问题。√√√√√三级封锁协议√√√√二级封锁协议√√一级封锁协议可重复读不读¡°脏¡±数据不丢失修改事务结束释放操作结束释放事务结束释放操作结束释放一致性保证S锁X锁•XlockA获得•读A=16XlockA•A=A-1等待写回A=15等待Commit等待UnlockA•获得XlockA读A=15A=A-1•写回A=14CommitUnlockAT1T2a.没有丢失修改•SlockASlockB读A=50读B=100求和150•XlockB等待•读A=50等待读B=100等待求和150等待Commit等待UnlockA等待UnlockB•获得XlockB读B=100B=B*2•写回B=200CommitUnlockBT1T2b.可重复读•XlockC读C=100C=C*2写回C=200•SlockC等待•RollBack等待(C恢复为100)等待UnlockC•获得SlockC读C=100•CommitUnlockCT1T2c.不读“脏”数据5活锁:事务T申请对数据R进行封锁,但由于加锁请求选择策略的问题而导致事务T长时间甚至永远处于等待状态,这就是活锁。如“随机选择”和“先申请后选择”策略。选择策略:最简单有效的选择策略是“先来先服务”的策略。封锁子系统按请求在时间上的先后次序对事务排序,数据对象上原有的锁一释放,即执行队列中第一个事务的封锁请求。此方法简单地避开了活锁的问题。也可在排队的基础上,对事务加上优先级。优先级高的事务可以适当前插,从而显著减少它的等待时间。8.1.5死锁死锁:虽然选择策略是合理的,但仍然不可能被选中的封锁申请称为死锁。死锁的解决方法。在数据库中,能解决死锁的方法有两种:预防发生和解决死锁法。死锁的预防,就是破坏产生死锁的条件。通常有一次封锁法和顺序封锁法两种。一次封锁法:任何事务必须一次同时申请所有加锁要求,若不能全部加锁成功,则全部不加锁,并处于等待状态,若全部加锁成功,则可继续执行下去,在执行过程中不能再次对任何数据申请加锁。一次封锁法,有效防止了死锁的发生,同时却降低了系统的并发性。•一次要把所有要用到的数据对象加锁•一次要把所有可能要用到的数据对象加锁顺序封锁法:预先对数据对象规定一个封锁顺序,所有事务都按这个顺序实行封锁。若有一个数据对象加锁未成功,只能等待之,不得先封锁后面的数据对象。顺序封锁法可有效防止死锁的产生,但却很难实现。TT11LockR1···LockR2等待等待等待等待等待TT22LockR2···LockR1等待等待等待T1、T2相互等待对方释放各自要加锁的数据,形成死锁6可见,在操作系统中广为采用的预防死锁的策略并不太适合数据库的特点,因此,DBMS在解决死锁问题上普遍采用的是诊断并解除死锁的方法。死锁的诊断与解除。数据库中诊断死锁的方法与操作系统类似,一般使用超时法或事务等待图法两种。•超时法•如果一个事务的等待时间超过了规定的时限,就认为发生了死锁。超时法实现简单,但有两个缺点:•规定时限过短时,可能发生误判死锁•规定时限过长时,死锁发生后不能及时被发现。•等待图法•事务等待图是一个有向图G=(T,U)。T为结点的集合,每个结点表示正在运行的事务;U为边的集合,每条边表示事务等待的情况。若T1等待T2,则T1、T2之间划一条有向边,从T1指向T2。•事务等待图动态地反映了所有事务的等待情况。并发控制子系统周期性地(比如每隔1min)检查事务等待图,如果发现图中存在回路,则表示系统中出现了死锁。DBMS的并发控制子系统一旦检测到系统中存在死锁,就要设法解除。通常采用的方法是选择一个处理死锁代价最小的事务,将其撤销(RollBack),释放此事务持有的所有锁,使其它事务得以继续运行下去。一般有下列三种方法选择要撤销的事务:•选择最迟交付的事务;•选择已获锁最少的事务;•选择卷回代价最小的事务.8.1.6并发调度的可串行性计算机系统对并发事务中并发操作的调度是随机的,而不同的调度可能会产生不同的结果,那么哪个结果是正确的,哪个又是不正确的?如果一个事务运行过程中没有其他事务同时运行,即它没有受到其他事务的干扰,那么就可以认为该事务的运行结果是正确的或者说是预想的。因此将所有事务串行起来的调度策略一定是正确的调度策略。虽然以不同的顺序串行执行事务可能会产生不同的结果,但由于不会将数据库置于不一致状态,所以,即便结果不同,那也是正确的(如售票系统)。定义当且仅当多个事务按照某种调度策略并发执行的结果,与它们按某一次序串行执行的结果相同时,就说它们并发执行的结果是正确的,并把它们所遵循调度策略称为可串行化的调度(Serializable)7可串行性(Serializability)是并发事务正确性的准则。按这个准则规定,一个给定的并发调度,当且仅当它是可串性化的,才认为是正确的调度。例子:有两个事务T1和T2,分别包含下列操作:•T1:读B;A=B+1•T2:读A;B=A+1•假设A,B的初值均为2,则按T1→T2次序执行结果为A=3,B=4;按T2→T1次序执行结果为B=3,A=4。下列是三种不同的调度策略:•为了保证并发操作的正确性,DBMS的并发控制必须提供一定的手段来保证调度是可串行化的。•从理论上讲,在某一事务执行时禁止其他事务执行的调度策略一定是可串行化的调度,这也是最简单的调度策略,但实际上是不可取的,因为…。•目前DBMS普遍采用封锁方法实现并发操作调度的可串行性,从而保证调度的正确性。•两段锁(Two-PhaseLocking,简称2PL)协议就是保证并发调度可串行性的封锁协议。•除此之外,还有其他一些方法,如时标法、乐观方法等等,下面,我们学习两段封锁协议。8.1.7两段封锁协议•一个事务在读、写任何数据前必须首先申请并获得对该数据的封锁;一旦一个事务TT11SLockBY=B=2UnlockBXlockAA=Y+1写回A(=3)UnlockATT22SLockAX=A=3UnlockAXlockBB=X+1写回B(=4)UnlockB串行调度TT11SLockBY=B=3UnlockBXlockAA=Y+1写回A(=4)UnlockATT22SLockAX=A=2UnlockAXlockBB=X+1写回B(=3)Unlock
本文标题:第8章_数据库保护
链接地址:https://www.777doc.com/doc-2199066 .html