08-事务 存储

事务

  • 事务:用户定义的不可分割的一组操作序列

  • ACID 特性

    • 原子性 Atomicity:要么全做,要么全不做

    • 一致性 Consistency:事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态(完整性约束没有被破坏)

    • 隔离性 Isolation:并发执行的事务之间互不干扰

    • 持久性 Durability:事务一旦提交,对数据库的修改是永久性的

  • 破坏事务 ACID 特性的因素

    • 多个事务并行

    • 事务在运行中被强行终止

BEGIN TRANSACTION
-- 事务开始
-- 事务中的操作
  SQL 1
  SQL 2
-- ...
COMMIT
-- 提交事务
ROLLBACK
-- 回滚事务

故障 & 恢复

  • 数据库本身被破坏

  • 数据库未破坏,数据不正确

分类

  • 事务故障:事务在正常终止点前被终止

  • 系统故障:操作系统/硬件层面的停止运转

  • 介质故障:硬件层面

  • 计算机病毒

  • 恢复:利用冗余数据重建数据库

数据转储 & 日志

  • 转储:定期将数据库完整复制到其他介质

  • 恢复到故障发生时的状态需重新运行转储以后的所有更新事务

转储方法

  • 静态转储:在无事务运行时转储

    • 优点:数据一致,实现简单

    • 缺点:降低数据库可用性

  • 动态转储:在有事务运行时转储

    • 优点:不影响数据库可用性

    • 缺点:数据不一致,恢复时需要和更改日志结合

  • 海量转储:全量

  • 增量转储:增量

日志

  • 记录事务对数据库的更新操作的文件

  • 格式

    • 以记录为单位

    • 以数据块为单位

  • 用途:事务故障、系统故障、介质故障恢复

  • 登记日志原则

    • 登记次序需严格按照事务的执行顺序

    • 先登记后执行(多一次无效的撤销不会影响数据正确性)

恢复策略

  • 事务故障:恢复子系统根据日志自动撤销对数据库的更改

    • 反向扫描日志文件,执行逆操作

  • 系统故障

    • 回滚未完成的事务:只有BEGIN,没有COMMIT(做题中已经正常状态下到ROLLBACK的事务也要计入在故障时需回滚事务中)

    • 重做已提交的事务:有BEGINCOMMIT

    • 正向扫描文件

    • 自动完成

  • 介质故障:重装数据库、重做已完成的事务

    • 需人工介入

    • 随后重做已提交的事务

检查点

  • 恢复的问题:搜索日志和重做浪费大量时间

  • 检查点:在日志文件中增加检查点、重新开始文件,动态维护日志

    • 检查点记录:建立时刻正在执行的事务清单,事务最近一个日志记录的地址

    • 重新开始文件:“检查点记录”在日志文件中的地址

  • 维护日志文件步骤:周期性建立检查点,保存数据库状态

    1. 将日志缓冲区中的日志写入日志文件

    2. 在日志文件中增加检查点记录

    3. 将数据缓冲区的数据记录写入数据库

    4. 将 检查点记录 在日志文件中的地址写入 重新开始文件

  • 建立检查点:定期/不定期

  • 恢复策略

    • 在检查点之前结束:无需重做

    • 在检查点建立-故障之间结束:重做

    • 在故障时仍未结束:回滚

  • 恢复步骤

    1. 从重新开始文件中找到最后一个检查点记录在日志文件中的地址,由此找到最后一个检查点记录

    2. 将所有正在执行的事务放入 ACTIVE 队列,将 ACTIVE 队列中的事务放入 UNDO 队列

    3. 从检查点记录开始,向后扫描日志文件

      • 若有新事务:加入 UNDO 队列

      • 若有已提交事务:移入 REDO 队列

    4. UNDO 队列中的事务进行撤销,REDO 队列中的事务进行重做

数据库镜像

  • 故障时:无需关闭系统、重装副本,由 DBMS 自动恢复

  • 没有故障时可并发操作:读并发,写加锁

  • 实际中只对关键数据/日志镜像

最后更新于