【数据库系统 -8】数据库管理
数据库安全的高层观点:
数据库安全性常用的控制方法:
视图:把要保密的数据对无权存取这些数据的用户隐藏起来,对数据提供一定程度的安全保护
审计
数据加密
数据库完整性
数
数据库安全 数据库安全的高层观点: 数据库安全性常用的控制方法: 视图:把要保密的数据对无权存取这些数据的用户隐藏起来,对数据提供一定程度的安全保护 审计 数据加密 数据库完整性 数据库完整性包含了: 在数据库刚开始,我们就已经介绍了数据库的完整性约束,参见:【数据库系统-2】关系数据库,在这里我们再细化一下: 对实体完整性约束: 对参照完整性约束: 对于用户自定义的完整性约束: 数据库并发控制事务 事务是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位,是恢复和并发控制的基本单位。 定义方式: BEGIN TRANSACTIONsql1...sql2......COMMIT (或ROLLBACK) 对于COMMIT:事务中所有对数据库的更新写回到磁盘上的物理数据库中 对于ROLLBACK:系统将事务中对数据库的所有已完成的操作全部撤销 ACID属性: 并发控制概述 多用户数据库系统指的是允许多个用户同时使用的数据库系统,例如12306,携程等等,多用户数据库系统的特点就是在同一时刻并发运行的事务数可达成百上千个。 多事务的处理机执行一般有以下的几种方式: 这里讨论的并发控制均是基于第二种并发方式——交叉并发执行。之所以要并发控制,是因为我们要维护数据库的稳定性。一般来讲,多事务执行,OS课上讲的那些问题就都有可能会出现,诸如读后写造成的不一致的问题。在数据库的并发控制中,并发操作可能带来以下问题: 并发控制就是要用正确的方式调度并发操作,使一个用户事务的执行不受其他事务的干扰,从而避免造成数据的不一致性,涉及到OS里面一些调度的思想,但也还行。并发控制的主要技术有: 封锁 封锁就是事务T在对某个数据对象(例如表、记录等)操作之前,先向系统发出请求,对其加锁。加锁后事务T就对该数据对象有了一定的控制,在事务T释放它的锁之前,其它的事务不能更新此数据对象。基本的封锁类型有排他锁(X锁)和共享锁(S锁)。 X锁 X锁也称为写锁。若事务T对数据对象A加上X锁,则只允许T读取和修改A,其它任何事务都不能再对A加任何类型的锁,直到T释放A上的锁,保证其他事务在T释放A上的锁之前不能再读取和修改A。 S锁 S锁也称为读锁。若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其它事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。S锁保证其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。 下面是一些例子 (1)使用封锁机制解决丢失修改问题 T1在对A进行修改之前加了X锁,这时如果T2也请求修改A,加X锁的时候会被阻塞,只有当T1处理完,释放X锁,T2才能获得X锁,对A进行修改。这样就避免了丢失修改。 (2)使用封锁机制解决读取脏数据问题 T1再对A进行修改之前,加上X锁,这个时候T2请求读A,加S锁被阻塞,只有当T1回滚释放X锁之后,T2才能获得S锁,对A进行读,这就避免了脏数据。 (3)使用封锁机制解决不可重复读问题 T1请求读取A和B,对A和B分别加S锁,当T2请求修改B,加X锁时被阻塞,只有当T1完成校验,释放S锁后,T2才能获得X锁完成接下去的工作。这样就解决了不可重复读问题。 总结一下: 活锁和死锁活锁 事务T1封锁了数据R,事务T2请求封锁R,于是T2等待;T3也请求封锁R,当T1释放了R上的封锁之后,系统首先批准了T3的请求,T2仍然等待;T4又请求封锁R,当T3释放了R上的封锁之后,系统又批准了T4的请求…这样,T2虽然没有处于忙等状态,但就是一直得不到资源,这就是活锁发生时的情形。时空图如下: 如何避免活锁产生? 采用先来先服务策略:当多个事务请求封锁同一数据对象时数据库系统安全,按请求封锁的先后次序对这些事务排队,该数据对象上的锁一旦释放,首先批准申请队列中第一个事务获得锁。(数据结构:优先队列) 死锁 事务T1封锁了数据R1,T2封锁了数据R2,T1又请求封锁R2,因T2已封锁了R2,于是T1等待T2释放R2上的锁;接着T2又申请封锁R1,因T1已封锁了R1,T2也只能等待T1释放R1上的锁。这样T1在等待T2,而T2又在等待T1,T1和T2两个事务永远不能结束,形成死锁。 如何解决死锁?OS告诉我们可以从三个方面入手:检测死锁、避免死锁、解除死锁。对数据库的并发控制也一样: 要求每个事务必须一次将所有要使用的数据全部加锁,否则就不能继续执行 顺序封锁法是预先对数据对象规定一个封锁顺序,所有事务都按这个顺序实行封锁 超时法:如果一个事务的等待时间超过了规定的时限,就认为发生了死锁。这种方法实现起来简单,但是有可能产生误判,也有可能无法及时发现死锁(取决于超时时间设置为多长)。 等待图法: 事务等待图是一个有向图G=(T,U),T为结点的集合,每个结点表示正运行的事务;U为边的集合,每条边表示事务等待的情况;若T1等待T2,则T1,T2之间划一条有向边,从T1指向T2。如果图中存在回路,则表示系统中出现了死锁。 并发调度的可串行性 上面我们讲丢失修改、不可重复读、读取脏数据的封锁策略,我们说封锁后得到的结果是正确的。这个正确是相对于什么说的呢?显然,如果一个并行的程序,其最终结果等价于串行执行的结果,那么这个并行调度就是可行的,称为可串行化调度。 冲突可串行化调度 冲突可串行化是比可串行化更严格的条件,首先我们要认识一下冲突操作。冲突操作指的是:不同事务对同一数据的读写操作和写写操作。(容易理解读读操作不会冲突) 不同事务的冲突操作和同一事务的两个操作是不能交换的。对于Ri(x)和Wj(x),若改变两者的次序,则事务Ti看到的数据库状态就发生了改变,自然会影响到事务Ti后面的行为。对于Wi(x)和Wj(x),改变二者的次序也会影响数据库的状态,x的值由等于Tj的结果变成了等于Ti的结果。 冲突可串行化:一个调度Sc在保证冲突操作的次序不变的情况下,通过交换两个事务不冲突操作的次序得到另一个调度Sc’,如果Sc’是串行的,称调度Sc是冲突可串行化的调度。 若一个调度是冲突可串行化,则一定是可串行化的调度。但是可串行化的调度,不一定冲突可串行化。 举个例子来讲,现有调度: Sc2等价于一个串行调度T1,T2。所以Sc1是冲突可串行化的调度。 两段锁协议 数据库管理系统普遍采用两段锁协议的方法实现并发调度的可串行性,从而保证调度的正确性。两段锁协议指的是所有事务必须分两个阶段对数据项加锁和解锁 。 两段锁协议下,事务分为两个阶段: 下图是一个示意: 封锁粒度 封锁粒度指的就是封锁对象的大小,封锁的对象可包括逻辑单元和物理单元: 一般来讲, 三级粒度树: (编辑:威海站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |