数据库事务管理与恢复全解析
立即解锁
发布时间: 2025-08-23 00:50:41 阅读量: 5 订阅数: 21 


数据库系统:从设计到实现的核心指南
### 数据库事务管理与恢复全解析
#### 1. 多粒度锁的锁兼容性
在数据库操作中,为了保证数据的一致性和并发控制,会使用不同类型的锁。意向锁分为共享(S)和排他(X)两种。意向共享(IS)锁仅与排他锁冲突,意向排他(IX)锁与共享锁和排他锁都冲突。此外,事务还可以持有共享意向排他(SIX)锁,它在逻辑上等同于同时持有共享锁和IX锁。SIX锁与任何与共享锁或IX锁冲突的锁都冲突,即SIX锁仅与IS锁兼容。多粒度锁的锁兼容性表如下:
| | IS | IX | S | SIX | X |
| --- | --- | --- | --- | --- | --- |
| IS | ✓ | ✓ | ✓ | ✓ | ✗ |
| IX | ✓ | ✓ | ✗ | ✗ | ✗ |
| S | ✓ | ✗ | ✓ | ✗ | ✗ |
| SIX | ✓ | ✗ | ✗ | ✗ | ✗ |
| X | ✗ | ✗ | ✗ | ✗ | ✗ |
其中,✓ 表示兼容,✗ 表示不兼容。
#### 2. 两阶段锁协议
为了确保在不同锁级别下的可串行性,使用两阶段锁协议,具体规则如下:
- 一旦任何节点被解锁,就不能再授予新的锁。
- 节点的父节点未被意向锁锁定时,该节点不能被锁定。
- 节点的所有子节点都解锁后,该节点才能解锁。
锁的应用是从根节点向下使用意向锁,直到到达需要实际读锁或排他锁的节点;锁的释放则是从叶子节点向上进行。不过,即使使用了两阶段锁协议,死锁仍然可能发生,需要进行相应的处理。
#### 3. 数据库恢复的必要性
数据存储通常涉及四种不同类型的介质,可靠性依次递增:主内存、磁盘、磁带和光盘。
- 主内存是易失性存储,系统崩溃时数据通常会丢失。
- 磁盘提供在线非易失性存储,比主内存更可靠、更便宜,但速度慢三到四个数量级。
- 磁带是离线非易失性存储介质,比磁盘更可靠且价格便宜,但速度慢,仅提供顺序访问。
- 光盘比磁带更可靠,通常更便宜、更快,并且提供随机访问。
数据库处理可能会受到多种类型的故障影响,故障原因包括:
- 硬件或软件错误导致的系统崩溃,造成主内存数据丢失。
- 介质故障,如磁头损坏或介质不可读,导致部分二级存储数据丢失。
- 应用程序软件错误,如访问数据库的程序存在逻辑错误,导致一个或多个事务失败。
- 自然物理灾难,如火灾、洪水、地震或电源故障。
- 操作员或用户的粗心或无意破坏数据或设施。
- 蓄意破坏,即故意破坏或篡改数据、硬件或软件设施。
无论故障原因如何,主要会产生两种影响:主内存(包括数据库缓冲区)数据丢失和磁盘上数据库副本丢失。
#### 4. 事务与恢复
在数据库系统中,事务是恢复的基本单位。恢复管理器的作用是在出现故障时保证事务的原子性和持久性这两个ACID属性。恢复管理器需要确保在故障恢复后,一个给定事务的所有影响要么永久记录在数据库中,要么都不记录。
以员工工资增加的操作为例,DBMS执行读操作的步骤如下:
1. 找到包含主键值为x的记录的磁盘块地址。
2. 将磁盘块传输到主内存的数据库缓冲区。
3. 将工资数据从数据库缓冲区复制到变量salary中。
DBMS执行写操作的步骤如下:
1. 找到包含主键值为x的记录的磁盘块地址。
2. 将磁盘块传输到主内存的数据库缓冲区。
3. 将变量salary中的工资数据复制到数据库缓冲区。
4. 将数据库缓冲区写回磁盘。
数据库缓冲区位于主内存中,数据在其中与二级存储进行传输。只有当缓冲区的数据刷新到二级存储后,更新操作才能被视为永久生效。缓冲区刷新到数据库可以通过特定命令(如事务提交)触发,也可以在缓冲区满时自动触发,这种显式将缓冲区写入二级存储的操作称为强制写入。
如果在写入缓冲区和将缓冲区刷新到二级存储之间发生故障,恢复管理器需要确定执行写入操作的事务在故障发生时的状态:
- 如果事务已经提交,为了确保持久性,恢复管理器需要重做该事务对数据库的更新(也称为前滚)。
- 如果事务在故障发生时未提交,为了保证事务的原子性,恢复管理器需要撤销(回滚)该事务对数据库的所有影响。如果只需要撤销一个事务,称为部分撤销;如果需要撤销所有活动事务,则称为全局撤销。
例如,有多个并发执行的事务T1, …, T6,DBMS在时间t0启动,在时间tf发生故障。假设事务T2和T3的数据在故障前已写入二级存储。显然,T1和T6在崩溃时未提交,因此在重启时,恢复管理器必须撤销T1和T6。然而,对于其他已提交的事务T4和T5,由于不确定数据库缓冲区是否已写入磁盘,恢复管理器在没有其他信息的情况下,必须重做T2、T3、T4和T5。
#### 5. 缓冲区管理
数据库缓冲区的管理在恢复过程中起着重要作用。缓冲区管理器负责高效管理用于在二级存储和主内存之间传输页面的数据库缓冲区。具体操作包括:
- 从磁盘读取页面到缓冲区,
0
0
复制全文
相关推荐










