1、12021/2/21第十章第十章 数据库的安全性和并发控制数据库的安全性和并发控制22021/2/21第一节第一节 数据库的安全性数据库的安全性一、数据库的安全性一、数据库的安全性 所谓数据库的安全性是指保护数据所谓数据库的安全性是指保护数据以防止不合法的使用所造成的数据泄漏、以防止不合法的使用所造成的数据泄漏、更改和破坏。更改和破坏。32021/2/21二、二、数据库的安全级别数据库的安全级别1、应用环境级、应用环境级2、操作系统级、操作系统级3、网络级、网络级4、数据库系统级、数据库系统级42021/2/21三、三、存取控制存取控制1、用户权限:用户使用数据库的方式。、用户权限:用户使用数
2、据库的方式。数据对象数据对象操作权限操作权限属性列属性列SELECT、INSERT、DELETE、UPDATE、ALL PRIVILEGES视图视图SELECT、INSERT、DELETE、UPDATE、ALL PRIVILEGES基本表基本表SELECT、INSERT、DELETE、UPDATE、ALTER、INDEX、ALL PRIVILEGES数据库数据库CREATETAB52021/2/212、授予权限、授予权限GRANT,.ON TO ,.WITH GRANT OPTION;WITH GRANT OPTION 指获得权限的用指获得权限的用户可以将权限授予其他用户。户可以将权限授予其他
3、用户。62021/2/21 例例1 DBA把把Orders数据库中建立基本表数据库中建立基本表的权限授予用户的权限授予用户USER001和和USER002。GRANT CREATETAB ON OrdersTO USER001,USER002;72021/2/21 例例2 DBA把查询把查询Customer表的权限授予表的权限授予用户用户USER003。GRANT SELECTON CustomerTO USER003;82021/2/21 例例3 USER002把对把对Product表的查询和修改表的查询和修改Stock属性列的权限授予用户属性列的权限授予用户USER004,并允,并允许许U
4、SER004将此权限再转授给其他用户。将此权限再转授给其他用户。GRANT SELECT,UPDATE(Stock)ON ProductTO USER004WITH GRANT OPTION92021/2/21 例例4 DBA把对把对Product表的所有权限授表的所有权限授予所有用户予所有用户GRANT ALL PRIVILEGESON ProductTO PUBLIC注:此处注:此处“PUBLIC”指所有用户。指所有用户。102021/2/213、收回权限、收回权限REVOKE ,.ON FROM ,.;112021/2/21 例例1 将将USER003对对Customer表的查表的查询权
5、限收回。询权限收回。REVOKE SELECTON CustomerFROM USER003122021/2/21REVOKE SELECT,UPDATE(Stock)ON ProductFROM USER004 例例2 将将USER004 对对Product表的查询和修表的查询和修改改Stock属性列的权限收回。属性列的权限收回。132021/2/21 例例3 DBA把把USER001和和USER002在在Orders数据库中建立基本表的权限收回。数据库中建立基本表的权限收回。REVOKE CRATETABON OrdersFROM USER001,USER002;142021/2/21第二
6、节第二节 数据库的并发控制数据库的并发控制一、事务一、事务 事务是数据库的逻辑工作单位,由用户定事务是数据库的逻辑工作单位,由用户定义的一组操作序列组成,序列中的操作要义的一组操作序列组成,序列中的操作要么全做,要么全不做。么全做,要么全不做。1、事务的定义、事务的定义152021/2/212、事务的特性、事务的特性(1)原子性:事务中的操作要么不做,要么)原子性:事务中的操作要么不做,要么全做;全做;(2)一致性:数据库从一个一致状态变为另)一致性:数据库从一个一致状态变为另一个一致状态;一个一致状态;(3)隔离性:任一事务的执行不受其他事务)隔离性:任一事务的执行不受其他事务的干扰;的干扰
7、;(4)持续性:事务完成后其对数据库的更改)持续性:事务完成后其对数据库的更改不会因系统故障而丢失。不会因系统故障而丢失。162021/2/21二、事务的串行调度和并发调度二、事务的串行调度和并发调度1、调度、调度 事务的执行次序。事务的执行次序。2、串行调度:、串行调度:多个事务按先后顺序依次执行。多个事务按先后顺序依次执行。3、并行调度:、并行调度:多个事务同时交叉执行。多个事务同时交叉执行。172021/2/214、实例、实例 有两个事务有两个事务T1和和T2,它们都要订购某,它们都要订购某日某车次的日某车次的2张硬卧火车票和张硬卧火车票和1张软卧火车张软卧火车票,这两个事务都包含下列操
8、作票,这两个事务都包含下列操作182021/2/21read(A);/从数据库中读出硬卧车票剩余数量从数据库中读出硬卧车票剩余数量AA=A-2;/订购了订购了2张车票张车票,write(A);/将新的剩余硬卧车票数量将新的剩余硬卧车票数量A写回数据库写回数据库write(B);/将新的剩余软卧车票数量将新的剩余软卧车票数量B写回数据库写回数据库read(B);/从数据库中读出剩余软卧车票数量从数据库中读出剩余软卧车票数量BB=B-1;/订购了订购了1张车票张车票192021/2/21对事务对事务T1和和T2执行串行操作执行串行操作(硬、软卧车票初始值为硬、软卧车票初始值为100和和50)事务事
9、务T1事务事务T2数据库中的值数据库中的值read(A)A=A-2write(A)read(B)B=B-1write(B)read(A)A=A-2write(A)read(B)B=B-1write(B)A=50A=48B=100B=99A=48A=46B=99B=98串行调度串行调度1:先:先T1后后T2事务事务T1事务事务T2数据库中的值数据库中的值read(A)A=A-2write(A)read(B)B=B-1write(B)read(A)A=A-2write(A)read(B)B=B-1write(B)A=50A=48B=100B=99A=48A=46B=99B=98串行调度串行调度2:
10、先:先T2后后T1202021/2/21对事务对事务T1和和T2执行并发操作执行并发操作(硬、软卧车票初始值为硬、软卧车票初始值为100和和50)事务事务T1事务事务T2数据库中的值数据库中的值read(A)A=A-2write(A)read(B)B=B-1write(B)read(A)A=A-2write(A)read(B)B=B-1write(B)A=50A=48A=46B=100B=99B=98并发调度并发调度1事务事务T1事务事务T2数据库中的值数据库中的值read(A)A=A-2write(A)read(B)B=B-1write(B)read(A)A=A-2write(A)read(
11、B)B=B-1write(B)A=50A=48B=100A=48A=46B=100B=99B=99并发调度并发调度2212021/2/21 6、结论、结论 事务串行调度的结果总是正确的,事务串行调度的结果总是正确的,而事务并发调度的结果则不一定完全正确。而事务并发调度的结果则不一定完全正确。当多个事务并发调度的结果与串行当多个事务并发调度的结果与串行调度的结果相同时,称该并发调度是可串调度的结果相同时,称该并发调度是可串行化的调度。行化的调度。222021/2/21三、事务并发执行所带来的问题三、事务并发执行所带来的问题1、丢失修改、丢失修改时刻时刻事务事务T1事务事务T2数据库中的数据库中的
12、值值t0t1t2t3t4t5read(A)A=A-10write(A)read(A)A=A-5write(A)A=50A=50A=40A=45232021/2/212、不可重复读、不可重复读时刻时刻事务事务T1事务事务T2数据库中的数据库中的值值t0t1t2t3t4t5t6t7t8read(A)read(B)求求和和:A+B=150read(A)read(B)求求和和:A+B=350read(A)A=A+200write(A)A=50,B=100A=250242021/2/213、读、读“脏脏”数据数据时刻时刻事务事务T1事务事务T2数据库中的值数据库中的值t0t1t2t3t4read(A)A
13、=A*3write(A)ROLLBACKread(A)A=50 A=150A=150A=50252021/2/21四、封锁四、封锁1、封锁的含义、封锁的含义 封锁就是事务封锁就是事务T在对数据对象进行操作前,在对数据对象进行操作前,先向系统发出对数据对象的加锁请求,在获先向系统发出对数据对象的加锁请求,在获得系统批准后才能对数据对象进行操作,其得系统批准后才能对数据对象进行操作,其他事务不能对加锁的数据对象进行操作。他事务不能对加锁的数据对象进行操作。262021/2/212、封锁的两种基本类型、封锁的两种基本类型 (1)排它锁排它锁(X封锁、写锁封锁、写锁)数据对象被加上数据对象被加上X封锁
14、之后,其他事务不能再对该数据封锁之后,其他事务不能再对该数据对象实施任何封锁。对象实施任何封锁。(2)共享锁)共享锁(S封锁、读锁封锁、读锁)数据对象被加上数据对象被加上S封锁之后,其他事务只能对该数据对封锁之后,其他事务只能对该数据对象实施象实施S封锁。封锁。T2 T1XSXNNYSNYYYYY272021/2/213、封锁协议、封锁协议(1)一级封锁协议)一级封锁协议 内容:事务内容:事务T在更新数据对象在更新数据对象A以前,必以前,必须对数据对象须对数据对象A加加X锁,且直到事务锁,且直到事务T结束时才可以释放该锁。结束时才可以释放该锁。注意:注意:一级封锁可以防止一级封锁可以防止“丢失
15、修改丢失修改”。282021/2/21时刻时刻事务事务T1事务事务T2数据数据库中库中的值的值t0t1t2t3t4t5t6t7t8t9t10Xlock(A)read(A)A=A-10write(A)CommitUnlock(A)Xlock(A)WaitWaitWaitWaitXlock(A)read(A)A=A-5write(A)A=50 A=40A=40A=35一级封锁一级封锁时刻时刻事务事务T1事务事务T2数据数据库中库中的值的值t0t1t2t3t4t5read(A)A=A-10write(A)read(A)A=A-5write(A)A=50A=50A=40A=45修改丢失修改丢失2920
16、21/2/21(2)二级封锁协议)二级封锁协议内容:事务内容:事务T在更新数据对象在更新数据对象A以前,必须对数据以前,必须对数据对象对象A加加X锁,且直到事务锁,且直到事务T结束时才可以释结束时才可以释放该锁,还规定事务放该锁,还规定事务T在读取数据对象在读取数据对象B以以前必须先对其加前必须先对其加S锁,读完后即可释放锁,读完后即可释放S锁。锁。注意:注意:二级封锁可以防止二级封锁可以防止“丢失修改丢失修改”和和“读脏读脏数据数据”302021/2/21时时刻刻事务事务T1事务事务T2数据数据库中库中的值的值t0t1t2t3t4t5t6t7t8t9Xlock(A)read(A)A=A*3w
17、rite(A)ROLLBACKUnlock(A)Slock(A)WaitWaitSlock(A)read(A)A=50 A=150A=50A=50时时刻刻事务事务T1事务事务T2数据数据库中库中的值的值t0t1t2t3t4t5read(A)A=A*3write(A)ROLLBACKread(A)A=50 A=150A=150A=50读脏数据读脏数据二级封锁二级封锁312021/2/21(3)三级封锁协议)三级封锁协议内容:事务内容:事务T在更新数据对象在更新数据对象A以前,必须对以前,必须对数据对象数据对象A加加X锁,且直到事务锁,且直到事务T结束结束时才可以释放该锁,还规定事务时才可以释放该
18、锁,还规定事务T在读在读取数据对象取数据对象B以前必须先对其加以前必须先对其加S锁,锁,该锁也必须在事务该锁也必须在事务T结束时才可释放。结束时才可释放。注意:注意:三级封锁可以防止三级封锁可以防止“修改丢失修改丢失”、“读脏数据读脏数据”、“不可重复读不可重复读”。322021/2/21时时刻刻事务事务T1事务事务T2数据数据库中库中的值的值t0t1t2t3t4t5t6t7t8read(A)read(B)A+B=150read(A)read(B)A+B=350read(A)A=A+200write(A)A=50 B=100A=250时刻时刻事务事务T1事务事务T2数据库数据库中的值中的值t0
19、t1t2t3t4t5t6t7t8t9t10t11t12t13t14t15t16t17Slock(A)Slock(B)read(A)read(B)A+B=150read(A)read(B)A+B=150CommitUnlock(A)Unlock(B)Xlock(A)WaitWaitWaitWaitWaitXlock(A)read(A)A=A+200write(A)CommitUnlock(A)A=50 B=100A=250不可重复读不可重复读三级封锁三级封锁332021/2/214、活锁和死锁、活锁和死锁(1)活锁)活锁 在多个事务并发执行的过程中,可在多个事务并发执行的过程中,可能会存在某个尽
20、管总有机会获得锁的事能会存在某个尽管总有机会获得锁的事务却永远也没有得到锁,这种现象称为务却永远也没有得到锁,这种现象称为活锁。活锁。342021/2/21时刻时刻事务事务T1事务事务T2事务事务T3事务事务T4t0t1t2t3t4t5t6t7t8t9Lock(A)Unlock(A)Lock(A)WaitWaitWaitWaitWaitWaitWaitWaitLock(A)WaitLock(A)Unlock(A)Lock(A)WaitWaitLock(A).活锁示意图活锁示意图避免活锁的最简单方法是采用避免活锁的最简单方法是采用“先来先服务先来先服务”的策略。的策略。352021/2/21(2
21、)死锁)死锁多个事务各自拥有对一定数据对象的封锁,同时又多个事务各自拥有对一定数据对象的封锁,同时又在等待其他事务释放封锁才可以继续执行下去,这在等待其他事务释放封锁才可以继续执行下去,这样出现多个事务彼此互相等待的状态,称之为死锁。样出现多个事务彼此互相等待的状态,称之为死锁。时刻时刻事务事务T1事务事务T2t0t1t2t3t4t5t6Xlock(A)Xlock(B)WaitWaitWaitXlock(B)Xlock(A)WaitWait362021/2/21(3)避免死锁的方法)避免死锁的方法a、一次封锁法:要求每个事务一次性地将所一次封锁法:要求每个事务一次性地将所有要使用的数据加锁。有
22、要使用的数据加锁。主要缺点:扩大了封锁的范围,降低了系主要缺点:扩大了封锁的范围,降低了系统的并发度,影响了系统的效率。统的并发度,影响了系统的效率。b、顺序封锁法:要求所有事务必须按照一、顺序封锁法:要求所有事务必须按照一个预先约定的加锁顺序对使用到个预先约定的加锁顺序对使用到的数据加锁。的数据加锁。主要缺点:预先难以确定所有数据对象主要缺点:预先难以确定所有数据对象的加锁顺序。的加锁顺序。372021/2/21c、有些系统先不采用避免死锁的方法,而有些系统先不采用避免死锁的方法,而是由并发控制子系统检测有无死锁的发是由并发控制子系统检测有无死锁的发生,如有再设法解除死锁。生,如有再设法解除
23、死锁。死锁的检测可以利用死锁的检测可以利用“事务依赖图事务依赖图”方方法。法。T1T2T3T4382021/2/21五、两段锁协议五、两段锁协议1、两段锁协议将每个事务分为两个阶段,、两段锁协议将每个事务分为两个阶段,第一阶段是扩展阶段(申请封锁阶段),第一阶段是扩展阶段(申请封锁阶段),第二阶段是收缩阶段(释放封锁阶段)。第二阶段是收缩阶段(释放封锁阶段)。2、若并发执行的各事务都遵守两段锁协议,、若并发执行的各事务都遵守两段锁协议,则这些事务的任何并发调度都是可串行则这些事务的任何并发调度都是可串行化的。但是,可串行化的调度中的各事化的。但是,可串行化的调度中的各事务不一定遵守两段锁协议。务不一定遵守两段锁协议。392021/2/21本章小结本章小结一、数据库的安全性一、数据库的安全性1、掌握授权和收回权限的、掌握授权和收回权限的SQL语句语句二、数据库的安全性二、数据库的安全性 1、掌握事务的概念、掌握事务的概念 2、掌握封锁的概念以及各级封锁的内容、掌握封锁的概念以及各级封锁的内容 3、掌握并发调度中可能出现的问题及其、掌握并发调度中可能出现的问题及其解决的方法。解决的方法。402021/2/21412021/2/21