# 并发控制
## 多事务执行方式
### (1)事务串行执行
* 每个时刻只有一个事务运行，其他事务必须等到这个事务结束以后方能运行
* 不能充分利用系统资源，发挥数据库共享资源的特点
### (2)交叉并发方式（interleaved concurrency）
* 事务的并行执行是这些并行事务的并行操作轮流交叉运行
* 是单处理机系统中的并发方式，能够减少处理机的空闲时间，提高系统的效率
### (3)同时并发方式（simultaneous  concurrency）
* 多处理机系统中，每个处理机可以运行一个事务，多个处理机可以同时运行多个事务，实现多个事务真正的并行运行
* 最理想的并发方式，但受制于硬件环境
* 更复杂的并发方式机制
## 事务并发执行带来的问题
### 可能会存取和存储不正确的数据，破坏事务的隔离性和数据库的一致性
### DBMS必须提供并发控制机制
### 并发控制机制是衡量一个DBMS性能的重要标志之一
## 并发控制机制的任务
### 对并发操作进行正确调度
### 保证事务的隔离性
### 保证数据库的一致性
## 并发操作带来的数据不一致性
### 丢失修改（lost update）
* 丢失修改是指事务1与事务2从数据库中读入同一数据并修改
* 事务2的提交结果破坏了事务1提交的结果，导致事务1的修改被丢失。
### 不可重复读（non-repeatable read）
* 不可重复读是指事务1读取数据后，事务2执行更新操作，使事务1无法再现前一次读取结果。
### 读“脏”数据（dirty read）
* 事务1修改某一数据，并将其写回磁盘
* 事务2读取同一数据后
* 事务1由于某种原因被撤消，这时事务1已修改过的数据恢复原值
* 事务2读到的数据就与数据库中的数据不一致，
* 是不正确的数据，又称为“脏”数据。
## 封锁
### 什么是封锁
* 封锁就是事务T在对某个数据对象（例如表、记录等）操作之前，先向系统发出请求，对其加锁
* 加锁后事务T就对该数据对象有了一定的控制，在事务T释放它的锁之前，其它的事务不能更新此数据对象。
* 封锁是实现并发控制的一个非常重要的技术
### 基本封锁类型
* 排它锁（eXclusive lock，简记为X锁）
    * 排它锁又称为写锁
    * 若事务T对数据对象A加上X锁，则只允许T读取和修改A，其它任何事务都不能再对A加任何类型的锁，直到T释放A上的锁
* 共享锁（Share lock，简记为S锁）
    * 共享锁又称为读锁
    * 若事务T对数据对象A加上S锁，则其它事务只能再对A加S锁，而不能加X锁，直到T释放A上的S锁
### 基本锁的相容矩阵
### 封锁协议
* 1级封锁协议
    * 事务T在修改数据R之前必须先对其加X锁，直到事务结束才释放
    * 1级封锁协议可防止丢失修改
    * 在1级封锁协议中，如果是读数据，不需要加锁的，所以它不能保证可重复读和不读“脏”数据。
        * 读“脏”数据
        * 不可重复读
* 2级封锁协议
    * 1级封锁协议+事务T在读取数据R前必须先加S锁，读完后即可释放S锁
    * 2级封锁协议可以防止丢失修改和读“脏”数据。
    * 在2级封锁协议中，由于读完数据后即可释放S锁，所以它不能保证可重复读。
* 3级封锁协议
    * 1级封锁协议 + 事务T在读取数据R之前必须先对其加S锁，直到事务结束才释放
    * 3级封锁协议可防止丢失修改、读脏数据和不可重复读。
* 三级协议的主要区别
*XMind: ZEN - Trial Version*