阻止数据库访问之间的相互干扰==>并发控制技术==>事务处理
事务四个基本性质ACID:原子性(全部执行或都不执行),一致性(每个状态都一致),隔离性(事务的中间结果对其他事务不可见),持久性(成功提交后的结果是永久性的)
并发可能导致的问题:
丢失更新【一个用户对数据库的成功修改可能被其他用户覆盖】,
未提交依赖/污读【一个事务可能读取另一个未提交事务的中间结果】,
不一致分析【一个事务读取多个值,另一事务修改了其中某些值】
串行调度:每一个事务的操作都按顺序执行且各事务之间的操作没有任何交叉的调度。
如果一组事务并发执行,当且仅当调度能够产生和某些串行执行相同的结果时,调度才是正确的,这样的调度称为可串行化的。
冲突可串行调度中所有冲突操作的执行次序与其在某些串行调度中的执行次序相同。
1.为事务创建一个结点
2.如果T1读取了由T2修改的数据项的值,则创建有向边T2—>T1;
如果T1对T2已经读取的数据项执行写操作,则T2—>T1;
如果T1对T2已经修改的数据项执行了写操作,则T2—>T1;
3.如果S的优先图存在T2—>T1的边,则在任何与S等价的串行调度S‘ 中,T2都要出现在T1之前,如果有环存在,则调度不是冲突可串行的。
所有的冲突可串行化都是视图可串行化,反之不一定。没有有效的测试算法。
视图等价的三个条件:
(1)对每个数据项,每个调度都读没改过的相同的数据,避免未提交依赖.
如在调度S1中:事务T读取了x的初值,则在调度S2中事务T也应该读取x的这个初值
(2)每个调度读同一事务改过的相同数据,避免未提交依赖
(3)调度的最后写操作由同一事务完成,避免丢失更新
若对串行调度是视图等价的,则调度是视图可串行化的.
【对同一数据的写操作应该由同一个事务完成】
如果T1读取了由T2修改过的数据项,那么事务T2的提交操作应该在T1的提交操作之前。若调度中的每一对事务都能满足上述要求,则该调度称为可恢复调度
共享锁:该事务可以读数据,不能更新数据;其他事务也可以读数据,不能更新数据
互斥锁:该事务可以读数据/更新数据,其他事务不能读数据也不能更新数据
二段锁2PL协议——所有的加锁操作都要在解锁操作之前完成,所有锁在事务结束之后才能解锁
级联回滚/级联撤销:由于一个事务引发的一连串回滚的现象称为级联回滚cascading rollback
conservative 2PL严格2PL:所有的锁要到事务的最后才被释放;
弱严格2PL:只要求互斥锁到事务的最后被释放。
打破死锁只有一个方法:撤销其中的一个或多个事务
处理技术:超时处理/死锁预防/死锁检测与恢复【需要考虑撤销的损失】
死锁预防:加上时间戳,Wait-Die 只允许较老的事务等待一个较新的事务;Die-Wait 只允许较新的事务等待一个较老的事务
死锁检测:创建Wait-For Graph,WFG等待图。如果有环证明有死锁。
创建方法:(1)为每个事务创建一个节点;(2)如果事务T1等待对某数据项加锁,而该数据项当前已被T2加锁,则创建有向边T1—>T2.
方法:事务回滚,避免死锁。
较旧的事务(有较小时间戳的事务),在冲突中有较高的优先权。
时间戳排序协议工作原理:
(1)事务T发出一个读请求,若已被旧事务读取,就回滚用新的时间戳读取;
(2)事务T发出一个写请求,已被最新事务读取,就回滚用新的时间戳重启;已被新事物写入,就回滚用新的时间戳重启;否则,写入数据。
托马斯写规则:事务T发出一个写请求,已被最新事务读取,就回滚用新的时间戳重启;已被新事物写入,忽略废弃写;否则,写入数据。
[假设冲突是罕见的]提交时再检测是否有冲突.
三个阶段:
(1)读阶段;
(2)确认阶段[只读事务:如果有冲突就回滚重启重新读取;更新事务:如果有冲突撤销事务]
(3)写入阶段
作为保护单位的数据项尺寸。
越粗,并发性越低;越细,加锁需要保存的信息就越多。
一个结点被锁住,其子孙结点都被锁住。
一个节点加了意向锁,表明其有个子孙结点已加锁。
授予:自上而下;
释放:自下而上
数据库安全的定义:保护数据库免受故意或意外威胁的机制.
数据库安全的范畴:数据库中保存的数据
相关问题:盗用或假冒;破坏数据保密状态;破坏隐私;破坏完整性;破坏可用性.
授予一个主体权力或权限,使其能实现对系统或系统对象的合法访问.
基于权限的授予和回收.
有自主访问控制DAC[GRANT命令,REVOKE命令,由用户自主控制]和强制访问控制MAC.[单个用户无法更改.]
基于基础关系的一个或多个关系运算的动态结果.授权视图比授权基本表限制性更大更安全.
防止非法数据生成,从而避免产生误解或不正确的结果.
独立磁盘冗余阵列Redundant Array of Independent Disks
特点:应该具有容错功能