数据库的安全与保护(终)
四、数据库的并发控制
事务的串行执行和并发执行。
在多个事务并发执行时,事务相互之间可能有干扰,破坏 了事务的隔离性。
DBMS的并发控制子系统负责协调并发事务的执行,保证数 据库的一致性不受破坏。同时避免用户得到不正确的数据。
1、事务并发操作带来的问题
1、丢失更新问题
例:A的初值为100,事务 T1对A减30,事务T2对 A加倍。
2、不一致分析问题
例:事务T1对A减30,事务 T3读A。
3、依赖于未提交更新问题
例:事务T1对A减30,但未提交, 事务T4读未提交的A值,而T1 做ROLLBACK操作。
这些问题都需要并发控制子系统来解决。
两种主要解决技术:
封锁(locking)技术
时标(timestamping)技术
2、排它型封锁(X封锁)
X封锁 含义:
如果事务Ti对某个数据(可以是数据项、记录、数据 集、以及整个数据库)实现X封锁,那么其它事务要等Ti 解除X封锁以后,才能对这个数据进行封锁。
记为:LOCK_X(R)
3、活锁和死锁
活锁
如果事务T1封锁了数据对象R后,事务T2也请求封锁R, 于是T2等待。接着T3也请求封锁R。T1释放R上的锁后,系统 首先批准了T3的请求,T2只得继续等待。接着T4也请求封锁 R。T3释放R上的锁后,系统又批准了T4的请求……,T2有可 能就这样永远等待下去,这就是活锁。
死锁
如果事务T1封锁了数据A,事务T2封锁了数据B。之后T1又 申请封锁数据B,因T2已封锁了B,于是T1等待T2释放B上的锁。 接着T2又申请封锁A,因T1已封锁了A,T2也只能等待T1释放A 上的锁。这样就出现了T1在等待T2,而T2又在等待T1的局面, T1和T2两个事务永远不能结束,形成死锁。
死锁
事务依赖图判断系统中是否存在死锁问题

解决方法:选择一个事务做回退操作。
4、由ROLLBACK引起的丢失更新问题
一个事务在做ROLLBACK操作时,将另外事务的更新丢失。

PXC协议: PX协议+下面规则
规则:X封锁必须保留到事务终点(COMMIT和ROLLBACK)。
5、共享型封锁(S封锁,shared lock)
X封锁数据由一个事务独锁,效率低下。
S封锁 允许并发读,不允许并发修改。
S封锁
含义: 如果事务Ti对某数据有一个S封锁,那么其 它事务Tj也能对这个数据实行S封锁。但是对这数据 的所有S封锁都解除之前决不允许任何事务对这数据 有X封锁。
记为:LOCK_S(R)
UNLOCK解除S封锁的操作,未必要等提交后才能解除, 因为被S封锁的数据不可能是未提交的修改。(允许 并发读,不允许并发修改。) 在并发操作时,一个事务如果不对数据实行封锁,就 进行读操作,也会因为其它事务的更新操作而产生错 误。例如:T1对A、B、C求和,T2对C值减10,对A值 加10。
有了S封锁之后,后来申请X封锁的一些事务,若并不 需要对封锁的数据进行修改,可改为申请S封锁。如 果要对数据进行更新,可以先申请S封锁,在写回时 将S封锁升级为X封锁。 优点:减少X封锁,增加了并发的可能性。 缺点:增加了死锁的机会。
PS协议
主要内容:
任何要更新记录R的事务必须先执行 LOCK_S(R) 操作,以获得对该记录的寻址能力并对它 取得S封锁。如果未获准S封锁,事务进入等待状态, 一直到获准S封锁,事务才能继续下去。在事务获准 对记录R的S的封锁后,记录R在修改前必须把S封锁升 级为X封锁。
PSC协议: PS协议+下面规则
规则:S封锁必须保留到事务终点(COMMIT和ROLLBACK)。

6、基于时标的并发控制
不采用封锁技术,因此不会产生死锁的调度。
时标/时戳
在事务Ti运行时,都有唯一的时间标记,简 称时标或时戳,用TS(Ti)表示。
事务开始运行的系统时间(称为启动时间) 或
每个事务与一个逻辑编号相联系
如果两个事务Ti和Tj的时标分别为TS(Ti)和 TS(Tj),并且有TS(Ti)<TS(Tj),则称Ti是年长的事务, Tj是年轻的事务。
事务的时标决定了可串行化的顺序。
原则:如果TS(Ti)<TS(Tj),那么系统必须保证产生 的调度应该等价于先Ti后Tj的串行调度。
对于每个数据项Q,系统记载两个时标值:
W_timestamp(Q) 成功执行write(Q)操作的最年轻事务的时标
R_timestamp(Q) 成功执行read(Q)操作的最年轻事务的时标
时标顺序协议
思想:
a、所有物理更新推迟到COMMIT时候,因此,未提交的修改 实际上根本没有建立。
b、如果一个事务要求查看被较年轻事务更新了的记录,或 者要求更新被较年轻事务查看过和更新过的记录,就会发 生冲突。通过重新启动发出请求的事务解决。
事务Ti执行read(Q)
i. 如果TS(Ti)<W_timestamp(Q)拒绝Ti的read(Q)操 作,并重新启动Ti。
ii. 如果TS(Ti)>=W_timestamp(Q),执行read(Q),并且 置R_timestamp(Q)的值为其和TS(Ti)中的大者。
iii.否则,执行write(Q) ,并置W_timestamp(Q)的置 为TS(Ti)。
五、数据库的恢复
数据库系统运行时,可能会出现各种故障,导致可 能丢失数据。 DBMS的恢复子系统要保证事务的原子性和持久性。
1、数据库遭遇的故障
❖ 事务故障
➢ 逻辑错误:数据输入错、溢出等
➢ 系统错误:系统进入错误的状态(如死锁)
❖ 系统故障
➢ 软件、硬件故障,引起内存信息丢失,但未破 坏外存中的数据
❖ 磁盘故障
➢ 磁盘损坏
常用恢复技术:
数据转储
DBA定期将整个数据库复制到磁带或另一个磁盘上保存 起来的过程。

静态转储 在系统重无运行事务时进行的转储操作。
动态转储 在转储期间允许对数据库进行存取和修改。
基于日志的恢复
日志
记载数据库修改信息的数据结构,称为“日志” (log)。
日志文件
日志文件是日志记录的集合(汇集)。
日志记录的形式
❑ 表示事务Ti执行开始
❑ 表示事务Ti对数据项Xj执行写 操作,写前值为V1,写后值为V2
❑ 表示Ti执行提交操作
❑ 表示Ti中止执行
使用日志的恢复技术
推迟数据库的修改
把事务的所有写操作推迟到事务局部提交后进行。
在事务局部提交后,根据日志记录中对数据库的修 改信息实施被推迟的写操作,以保证事务的原子性。
(在事务未完成前系统发生故障,或事务异常中止 时,修改的信息只写入日志,尚未写到磁盘,此时可忽 略日志中的信息。)
即时的数据库修改
允许事务在未做完情况下立即执行写操作,把新 的值写到磁盘上。
由活动事务写的数据修改称为“未提交的修改”。 在系统故障或事务故障时,系统根据日志记录中 的旧值替换新值。
