系列文章目录
第一章 数据库系统绪论
第二章 关系数据库
第三章 关系数据库标准语言SQL
第四章 数据库安全性
第五章 数据库完整性
第六章 关系数据理论—规范化
第七章数据库设计
第八章关系查询处理和查询优化
第九章数据库恢复技术
第十章并发控制
前言
事务可以一个一个地串行执行,即每个时刻只有一个事务运行。在单处理机系统中,事务的并行执行实际上是这些并行事务的并行操作轮流交叉运行。这种并行执行方式称为交叉并发方式。在多处理机系统中,每个处理机可以运行一个事务,多个处理机可以同时运行多个事务,实现多个事务真正的并行运行。这种并行执行方式称为同时并发方式。
为什么要并发控制技术?
当多个用户并发地存取数据库时就会产生多个事务同时存取同一数据的情况。若对并发操作不进行控制就可能存取和存储不正确的数据,破坏事务的一致性和数据库的一致性。所以数据库管理系统必须提供并发控制机制。
一、并发控制概述
事务是并发控制的基本单位。并发操作带来的数据不一致性包括丢失修改、不可重复读和读**“脏”数据**。
- 丢失修改
两个事务T1和T2读入同一数据并修改,T2提交的结果破坏了T1提交的结果,导致T1的修改被丢失。 - 不可重复读
不可重复读是指事务T1读取数据后,事务T2执行更新操作,使T1无法再现前一次读取结果。 - 读“脏”数据
读“脏”数据是指事务T1修改某一数据并将其写回磁盘,事务T2读取同一数据后,T1由于某种原因被撤销,这是T1修改后的数据恢复原值,T2读到的数据就与数据库中的数据不一致,则T2读到的数据为“脏”数据,即不正确的数据。
二、封锁
封锁是实现并发控制的一个非常重要的技术。基本的封锁类型有两种:排它锁(X锁)和共享锁(S锁)
排它锁又称为写锁。若事务T对数据对象A加上X锁,则只允许T读取和修改A,其他任何事务都不能再对A加任何类型的锁,直到T释放A上的锁为止。这就保证了其他事务在T释放A上的锁之前不能再读取和修改A。
共享锁又称为读锁。若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁为止。这就保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。
三、两段锁协议
Q: 什么是两段锁协议?
两段锁协议是指所有事务必须分两个阶段对数据项加锁和解锁。
- 在对任何数据进行读、写操作之前,首先要申请并获得对该数据的封锁。
- 在释放一个封锁之后,事务不在申请和获得任何其他封锁。
第一阶段是获得封锁,称为扩展阶段;第二阶段是释放封锁,称为收缩阶段。事务遵守两段锁协议是可串行化调度的充分条件,而不是必要条件。
多个事务的并发执行是正确的,当且仅当其结果与按其一次序串行地执行这些事务时的结果相同,称这种调度策略是可串行化调度。
四、封锁的粒度
封锁对象的大小称为封锁粒度。
封锁粒度与系统的并发度和并发控制的开销密切相关。直观地看,封锁的粒度越大,数据库所能够封锁的数据单元就越少,并发度就越小,系统开销也越小;反之,封锁的粒度越小,并发度较高,系统开销越大。