事务是一系列的数据库操作,是数据库应用程序的基本逻辑单元。事务处理(transaction processing)技术主要包括数据库恢复技术和并发控制技术。
10.1 事务的基本概念
-
事务:是用户定义的一个数据库操作序列,是一个不可分割的工作单位(原子性)
一般的,一个程序中被包含多个事务。如果用户没有显式的定义事务,则DBMS自动划分事务。
事务一般以BEGIN TRANSACTION开始,以COMMIT或ROLLBACK结束。ROLLBACK表示回滚,系统将事务中对数据库的所有已完成的操作全部撤销,回滚到事务开始时的状态。 -
事务的ACID特性
- 原子性:事务中的操作要么都做,要么都不做
- 一致性:事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态
- 隔离性:一个事物的执行不能被其他事务干扰,并发执行的各个事务之间不能互相干扰
- 持续性:一个事务一旦提交,它对数据库中数据的改变就应该是永久性的
可能破坏事务ACID特性的因素有:
- 多个事务并发运行时,不同事务的操作交叉执行
- 事务在运行过程中被强行停止
10.2 数据库恢复概述
数据库的恢复:把数据库从错误状态恢复到某一已知的正确状态
10.3 故障的种类
-
事物内部的故障:只影响这个事物本身,一般是非预期的,如运算溢出、因为死锁被撤销等,解决方法是强行回滚,称为事务撤销
-
系统故障(软故障):造成系统停止运转的任何事件,使得系统重新启动。影响正在运行的所有事务,但不破坏数据库。
解决方法:清除所有未完成的事务对数据库的所有更改。同时重做所有已提交的事务(因为这些已提交的事务可能还在缓冲区没写到磁盘上的物理数据库上)
-
介质故障(硬故障):指外存故障,如磁盘损坏
解决方法:备份
-
计算机病毒:产生故障的原因,本身不是故障,可能产生故障2或3
10.4 恢复的实现技术
建立冗余数据:
- 数据转储
- 登记日志文件
10.4.1 数据转储
静态转储:系统中无运行事务时进行的转储,转储期间不允许任何事务执行。
优点:得到的一定是一个数据一致性的副本
缺点:降低了数据库的可用性
动态转储:转储和用户事务可以并发执行
优点:系统可用性较好
缺点:转储得到的副本不一定一致,因此必须建立日志文件等级转储期间各事务对数据库的修改活动
海量转储:每次转储整个数据库,恢复更方便
增量转储:每次只转储上一次转储后更新过的数据,恢复较复杂
10.4.2 登记日志文件
1.日志文件的格式和内容
两种格式:以记录为单位/以数据块为单位
需要登记的内容:
- 各个事务的开始(BEGIN TRANSACTION)标记
- 各个事务的结束(COMMIT或ROLLBACK)标记
- 各个事务的所有更新操作
这里每个事务的开始标记、每个事物的结束标记和每个更新操作均作为日志文件中的一个日志记录(log record)。
每个日志记录文件的内容包括:
- 事务标识(标明是哪个事务)
- 操作的类型(插入、删除或修改)
- 操作对象(记录内部标识)
- 更新前数据的旧值(对插入操作而言,此项为空值)
- 更新后数据的新值(对删除操作而言,此项为空值)
对于以数据块为单位的日志文件,日志记录的内容包括事务标识和被更新的数据块。由于将更新前的整个块和更新后的整个块都放入日志文件中,操作类型和操作对象等信息就不必放入日志记录中了。
2. 日志文件的作用:
- 事务/系统故障恢复必须用日志文件
- 动态转储必须建立日志文件,后备副本和日志文件结合才能有效地恢复
3.登记日志文件的两条原则
- 登记的次序按并发事务执行的时间次序
- 必须先写日志文件,后写数据库
10.5 恢复策略
10.5.1 事务故障的恢复
系统自动完成的,对用户是透明的
恢复步骤:
- 反向扫描日志文件,查找该事务的更新操作
- 对该事务的更新操作执行逆操作
- 重复12,直至读到此事务的开始标记
10.5.2 系统故障的恢复
系统在重新启动时自动完成的,不需要用户干预
恢复步骤:
- 正向扫描日志文件,找出故障发生前已经提交的事务(有BEGIN有COMMIT),记入重做事务。同时找出未完成的事务(只有BEGIN),加入撤销队列
- 对撤销队列中的事务进行撤销处理:反向扫描并执行逆操作
- 对重做队列中的各个事务进行重做处理:正向扫描并重做
10.5.3 介质故障的恢复
恢复方法:
- 装入最新的数据库后备副本,对于动态转储还需同时装入转储开始时刻的日志文件副本
- 装入相应的日志文件副本(转储结束时刻的日志文件副本),重做已完成的事务
10.6 具有检查点的恢复技术
检查点记录的内容:
- 建立检查点时刻所有正在执行的事务清单
- 这些事务最近一个日志记录的地址
- 重新开始文件记录检查点记录
- 检查点记录里面记录活跃的事务:T1T2,以及它们的最后日志记录D1D2
恢复方法:
清理日志文件:在重新开始文件里面找到上一个与当前检查点没有相同的活跃事务的检查点,那么它之前的日志记录都可以删掉
日志刷出去了以后系统故障:没问题,因为这个检查点还没写到重新开始文件上,写重新开始文件是最后一步。
10.7 数据库镜像
用途:
- 介质故障时将应用迁移到镜像数据库,使数据库可以继续使用,同时恢复著数据库
- 提供系统并发访问