多事务执行方式:
①事务串行执行:每个时刻只有一个事务运行,等待其他事务结束方可运行
②交叉并发方式:在单处理机系统中,事务的并行执行是这些并行事务的并行操作轮流交叉运行
③同时并发方式:多处理机系统中,多个处理机可以同时运行多个事务,实现多个事务真正的并行运行
并发控制机制是衡量一个数据库管理系统性能的重要标志之一
事务是并发控制基本单位
并发控制机制任务:
①对并发操作正确调度
②保证事务的隔离性
③保证数据库一致性:丢失修改、不可重复读、读“脏”数据
数据不一致性:由于并发操作破坏了事务的隔离性
并发控制就是要用正确的方式调度并发操作,使一个用户事务的执行不受其他事务的干扰,从而避免造成数据的不一致性
并发控制的主要技术:①封锁 ②时间戳 ③乐观控制法 ④多版本并发控制
封锁:事务T在对某个数据对象操作前,先向系统发出请求,对其加锁
①排它锁(X锁):写锁,保证其他事务在T释放A上的锁之前不能再读取和修改A
②共享锁(S锁):读锁,保证其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改
运用X锁和S锁对数据对象加锁时,需要约定一些规则,这些规则称为封锁协议
事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放
如果仅仅是读数据不对其进行修改,是不需要加锁的,所以它不能保证可重复读和不读“脏”数据
一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,读完后即可释放S锁。
二级封锁协议可以防止丢失修改和读“脏”数据,不能保证可重复读。
一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,直到事务结束才释放。
三级封锁协议可防止丢失修改、读脏数据和不可重复读
X锁 |
S锁 |
一致性保证 |
|||||
操作结束释放 |
事务结束释放 |
操作结束释放 |
事务结束释放 |
不丢失 修改 |
不读“脏”数据 |
可重复 读 |
|
一级封锁协议 |
√ |
√ |
|||||
二级封锁协议 |
√ |
√ |
√ |
√ |
|||
三级封锁协议 |
√ |
√ |
√ |
√ |
√ |
避免活锁:先来先服务策略
预防死锁的发生就是破坏产生死锁的条件
①一次封锁法
要求每个事务必须一次将所有要使用的数据全部加锁,否则就不能继续执行
问题:降低系统并发度
②顺序封锁法
预先对数据对象规定一个封锁顺序,所有事务都按这个顺序实行封锁
问题:维护成本高、难以实现
数据库管理系统在解决死锁的问题上更普遍采用的是诊断并解除死锁的方法
死锁的诊断:
①超时法
如果一个事务的等待时间超过了规定的时限,就认为发生了死锁
优点:实现简单
缺点:有可能误判死锁,时限若设置得太长,死锁发生后不能及时发现
②等待图法
并发控制子系统周期性地(比如每隔数秒)生成事务等待图,检测事务。如果发现图中存在回路,则表示系统中出现了死锁。
死锁的解除:
①选择一个处理死锁代价最小的事务,将其撤消
②释放此事务持有的所有的锁,使其它事务能继续运行下去
数据库管理系统对并发事务不同的调度可能会产生不同的结果
串行调度是正确的,执行结果等价于串行调度的调度也是正确的,称为可串行化调度
多个事务的并发执行是正确的,当且仅当其结果与按某一次序串行地执行这些事务时的结果相同
冲突操作:是指不同的事务对同一数据的读写操作和写写操作
不能交换的动作:①同一事务的两个操作②不同事务的冲突操作
数据库管理系统普遍采用两段锁协议的方法实现并发调度的可串行性,从而保证调度的正确性
两段锁协议:指所有事务必须分两个阶段对数据项加锁和解锁
①在对任何数据进行读、写操作之前,事务首先要获得对该数据的封锁
②在释放一个封锁之后,事务不再申请和获得任何其他封锁
事务遵守两段锁协议是可串行化调度的充分条件,而不是必要条件,结果正确
封锁对象的大小称为封锁粒度
封锁对象:
①逻辑单元:属性值、属性值的集合、元组、关系、索引项、整个索引、整个数据库等
②物理单元:页(数据页或索引页)、物理记录等
显式封锁:直接加到数据对象上的封锁
隐式封锁:是该数据对象没有独立加锁,是由于其上级结点加锁而使该数据对象加上了锁
显式封锁和隐式封锁的效果是一样的
引入目的:提高对某个数据对象加锁时系统的检查效率
如果对一个结点加意向锁,则说明该结点的下层结点正在被加锁
对任一结点加基本锁,必须先对它的上层结点加意向锁
例如,对任一元组加锁时,必须先对它所在的数据库和关系加意向锁