并发控制概述
- 多事务执行方式 :
(1)事务串行执行
(2)交叉并发方式
(3)同时并发方式(多处理机) - 并发控制机制的任务
(1)对并发操作进行正确调度
(2)保证事务的隔离性
(3)保证数据库的一致性
事务并发执行破坏事务的隔离性和数据库的一致性。
数据的不一致性
- 数据丢失
- 不可重复读
- 读“脏”数据
并发控制的主要方法是封锁机制(对于DBMS)。
封锁
定义:封锁就是事务T在对某个数据对象(例如表、记录等)操作之前,先向系统发出请求,对其加锁。
影响:加锁后事务T就对该数据对象有了一定的控制,在事务T释放它的锁之前,其它的事务不能更新此数据对象。
基本封锁类型
-
排它锁(简记为X锁)又称为写锁
若事务T对数据对象A加上X锁,则只允许T读取和修改A,其它任何事务都不能再对A加任何类型的锁,直到T释放A上的锁。 -
共享锁(简记为S锁)又称为读锁
若事务T对数据对象A加上S锁,则其它事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。
三级封锁协议
- 一级封锁协议
事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放该锁。
结果:可防止丢失修改
- 二级封锁协议
一级封锁协议+事务T在读取数据R前必须先加S锁,读完后即可释放S锁。
结果:防止丢失修改和读“脏”数据。 - 三级封锁协议
一级封锁协议 + 事务T在读取数据R之前必须先对其加S锁,直到事务结束才释放
结果:防止丢失修改、不读“脏”数据和可重复读。
活锁和死锁
- 活锁: 先来先服务
- 死锁:
预防方法:一次封锁法和顺序封锁法 - 死锁的诊断与解除
超时法
等待图法
并发调度的可串行性
定义:多个事务的并行执行是正确的,当且仅当其结果与按某一次序串行地执行它们时的结果相同。这种并行调度策略称为可串行化(Serializable)的调度。
可串行性是并行事务正确性的唯一准则。
一个给定的并发调度,当且仅当它是可串行化的,才认为是正确调度。
冲突可串行化调度
冲突操作是指不同事务对同一个数据的读写操作和写写操作:
注意:不同事务对同一个数据的写读操作不是冲突操作。
不同事务的冲突操作和同一事务的俩个操作是不能交换的。
一个调度Sc在保证冲突操作次序不变的情况下,通过交换两个事务不冲突操作的次序得到另一个调度Sc1,如果Sc1是串行的,称调度Sc为冲突可串行化调度。
一个调度是冲突可串行化的,一定是可串行化的调度。——是充分条件
保证并发操作调度正确性的方法
封锁方法:两段锁(Two-Phase Locking,简称2PL)协议
两段锁协议
-
两段锁协议的内容:
- 在对任何数据进行读、写操作之前,事务首先要获得对该数据的封锁
- 在释放一个封锁之后,事务不再获得任何其他封锁。
-
“两段”锁的含义——事务分为两个阶段
- 第一阶段是获得封锁,也称为扩展阶段;
- 第二阶段是释放封锁,也称为收缩阶段。
事务遵守两段锁协议是可串行化调度的充分条件,而不是必要条件。