数据库九(并发控制)

事务并发执行带来的问题

会产生多个事务同时存取同一数据情况

可能会存取和存储不正确的数据,破坏事务一致性和数据库的一致性

一、并发控制概述

并发控制机制的任务:

对并发操作进行正确调度;保证事务的隔离性;保证数据库的一致性

并发操作带来数据不一致性:

丢失修改:两个事务同时读入同一个数据并修改,结果T2的提交破坏了T1提交的结果

不可重复读:事务T1读取数据后,事务T2执行更新操作,导致T1无法再现前一次读取结果

读脏数据:事务T1修改某一数据后写回磁盘,T2读取同一数据后,T1却被撤销了

并发控制主要技术:

有封锁、时间戳、乐观控制法。

二、封锁:

一个事务对某个数据对象加锁后究竟拥有什么样的控制由封锁的类型决定

基本封锁类型:排它锁(X锁)、共享锁(S锁)

锁的相容矩阵

 

三、活锁和死锁

活锁:某一个事务可能一直请求不到数据的封锁,而处于永远等待的状态

避免活锁:采用先来先服务策略

死锁:两个事务分别封锁了对方所需要的数据,导致两个事务永远不能结束,形成死锁

预防死锁:、

一次封锁法,每个事务必须一次将所有要使用的数据全部加锁

降低了并发度,难于事先精确确定封锁对象

顺序封锁法,预先对数据对象规定一个封锁顺序,所有事务都按这个顺序实施封锁

数据库系统中封锁的数据对象极多,并且在不断变化,维护成本高

很难事先确定每个事务要封锁哪些对象

死锁的诊断和解除:

超时法:如果一个事务的等待时间超过了规定时间,就认为发生了死锁

实现简单,但有可能误判死锁,若时限设置太长,死锁发生后不能及时发现

事务等待图法:

用事务等待图冬天反映所有事务等待情况,有向图。

并发控制子系统周期性生成事务等待图,检测事务,如果发现图中存在回路,则表明有死锁

解除死锁:选择一个处理死锁代价最小的事务,将其撤销,释放此事务所持有的的所有锁

四、并发调度的可串行性

可串行化调度:多个事务的并发执行是正确的,当且仅当其结果与按某一次序串行执行结果相同

可串行性:是并发事务正确调度的准则;一个给定的并发调度,当且仅当它是可串行化的,才认为是正确的

可串行化调度的充分条件:

1.一个调度Sc在保证冲突操作的次序不变的情况下,通过交换两个事务不冲突操作次序得到另个调度Scc,

若Scc是串行的,则Sc为可串行化调度。

2.一个调度是冲突可串行化,一定是可串行化的调度

冲突操作:两个事务对同一读写操作和写写操作

五、两段锁协议

运用封锁时,对数据对象加锁需要约定一些规则。

两段锁协议:事务必须分两个阶段对数据项加锁和解锁

在对任何数据进行读写操作之前,事务首先要获得对改数据的封锁

在释放一个封锁之后,事务部在申请和获得其他任何封锁

事务遵守两段锁协议是可串行化调度的充分条件

遵守两段锁协议也可能导致死锁

严格两段锁协议:要求满足两段锁协议外,还要求事务的排它锁必须在事务提交后释放,避免读脏数据

强两段锁协议:要求满足两段锁协议外,还要求事务的所有锁都必须在事务提交后释放

 

六、封锁的粒度

封锁对象的大小称为封锁粒度

封锁对象:逻辑单元、物理单元

逻辑单元:属性值、属性值集合、元组、关系、索引项、整个索引、整个数据库等

物理单元:页(数据页、索引页)、物理记录

封锁粒度与系统并发度和并发控制开销密切相关:

封锁粒度越大,数据库所能够封锁的素具单元越少,并发度越小,系统开销越小;

多粒度封锁:一个系统中同时支持多种封锁粒度供不同事务选择

选择封锁粒度:同时考虑封锁开销和并发度两个因素

需要处理多个关系的大量元组时,以数据库为封锁单元

需要处理大量元组时,以关系为封锁单元

需要处理少量元组时,以元组为封锁对象

多粒度树:

以树形结构来表示多级封锁粒度;根节点为数据库(最大数据粒度);叶节点为最小数据粒度

多粒度封锁协议:

允许多粒度树中每个节点被独立地加锁;对一个节点加锁意味着其所有后裔加同类型锁

显示封锁;隐式封锁

意向锁:

目的:提高加锁时系统检查效率;若果对一个结点加意向锁,则说明该节点下层正在被加锁;

对任意结点加基本锁,必须对上层结点加意向锁

意向共享锁(IS锁)、意向排它锁(IX锁)、共享意向排它锁(SIX锁)

意向锁的相容矩阵

 

 

锁的强度:对其他锁的排斥程度

 

具有意向锁的多粒度封锁方法:自上而下申请;自下而上释放

提高了系统并发度;减少了加锁解锁的开销;应用广泛