事物的基本概念
所谓事物是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的单位。
事物结束的两种类型
- 事务提交(commit):将成功完成的事务的执行结果(即更新)永久化,并释放事务占有的全部资源。
- 事务回滚(rollback):中止当前事务,撤销其对数据库所做的更新,并释放事务占有的全部资源。
MySQL默认采用自动提交事务模式(AutoCommit=1),即每一条INSERT、UPDATE、DELETE的SQL语句执行后,会自动执行COMMIT操作。如果想要显式地手动对事务进行操作,则需要set AutoCommit=0,或者在start transaction语句和commit(rollback)语句之间,编写SQL语句对事务进行操作。
事物的ACID特性
四大原则 | 解释 | DBMS保证事务原则的措施 |
---|---|---|
原子性(Atomicity) | 事务的所有操作要么全部都被执行,要么都不被执行。 | 由DBMS通过撤销(UNDO)未完成的事务对数据库的影响来实现。 |
一致性(Consistency) | 一个单独执行的事务应保证其执结果的一致性,即总是将数据库从一个一致性状态转化到另—个一致件状态。 |
由编写该事务代码的应用程序员负责,但有时也可利用DBMS提供的数据库完整性约束(如触发器)的自动检查功能来保证。 |
隔离性(Isolation) | 当多个事务并发执行时,一个事务的执行不能影响另一个事务,即并发执行的各个事务不能互相干扰。 | 由DBMS的并发控制模块保证。 |
持久性(Durability) | 一个事务成功提交后,它对数据库的改变必须是永久的,即使随后系统出现故障也不会受到影响。 | 由DBMS的恢复管理模块保证。 |
事物访问数据的方式
- 对于一个事务而言,它是通过三个地址空间同数据库进行交互:
- 保存数据库记录的磁盘块空间——物理数据库;
- 缓冲区管理器所管理内存地址空间——数据缓冲区;
- 事务的局部地址空间——事务工作区。
注意的是发出这些命令的对象是不同的:READ和WRITE由事务发出,而INPUT和OUTPUT由缓冲区管理器发出。
故障的分类、特征、及其恢复策略
事物故障
事务在运行过程中由于种种原因,如输入数据的错误、运算溢出、违反了某些完整性限制、某些应用程序的错误以及并发事务发生死锁等,使事务未运行至正常终止点就天折了,这种情况称为事务故障。
- 特征:系统的软件和硬件都能正常运行,内存和磁盘上的数据都未丢失和破坏。
恢复策略:强行回滚(ROLLBACK)夭折事务,清除其对数据库的所有修改,使得该事务好象根本没有启动过一样,称这类恢复操作称为事务撤销(UNDO)
系统故障
该类故障是指系统在运行过程中,由于某种原因,如操作系统或DBMS代码错误、操作员操作失误、特定类型的硬件错误(如CPU故障)、突然停电等造成系统停止运行,致使所有正在运行的事务都以非正常方式终止。
- 特征:数据库缓冲区的信息全部丢失,但存储在外部存储设备上的数据未被破坏。
恢复策略:
该类故障是指系统在运行过程中,由于某种硬件故障,如磁盘损坏、磁头碰撞,或操作系统的某种潜在错误,瞬时强磁场干扰等,致使存储在外存中的数据部分丢失或全部丢失。这类故障比前两类故障的可能性小得多,但破坏了磁盘上的数据,危害性最大。
- 特征:存储在外部存储设备上的数据被破坏。
恢复策略:需要装入发生介质故障前某个时刻的数据库数据副本,并重做(REDO)自备份相应副本数据库之后的所有成功事务,将这些事务已提交的更新结果重新反映到数据库中去。无需UNDO操作!
其它故障
黑客入侵、病毒、恶意流氓软件等引起的事务异常结束、篡改数据等不一致性。
- 特征:恶意破环。
- 恢复策略:通过数据库的安全机制、审计机制等实现对数据的授权访问和保护。
注意:
- 撤销所有未完成的事务,体现了事务的原子性。
-
日志
日志是DBMS记录数据库全部更新操作的序列文件。
- 日志文件记录了数据库的全部更新顺序。
- DBMS允许事务的并发执行导致日志文件是“交错的”。
日志记录通常是先写到日志缓冲区中,然后写到稳固存储器(如磁盘阵列)中。在不影响讨论的情况下,本章假设日志记录在生成时是直接写到稳固磁盘中。
数据库中的日志记录有两种类型:
表示事务Tj对数据元素A执行了更新操作,V1表示A更新前的值(前映像),V2表示A更新后的值(后映像)。对于插入操作,V1为空; 对于删除操作,V2为空。 表示事务Tj已经开始。此时DBMS完成对事务的初始化工作,如分配事务工作区等。 表示事务Tj已经提交,即事务Tj已经执行成功(该事务对数据库的修改必须永久化)。事务提交时其更新的数据都写到了数据缓冲区中,但是由于不能控制缓冲区管理器何时将缓冲块从内存写到磁盘。因此当看到该日志记录时,通常不能确定更新是否已经写到磁盘上。 表示事务已经中止,即事务执行失败。此时,如果Tj,所做的更新已反映到磁盘上,DBMS必须通过UNDO操作来消除T,对磁盘数据库的影响。 先写日志规则
为了保证数据库能运用日志进行恢复,要求日志文件必须放到稳固存储器(如磁盘阵列)上,并且要求每条日志记录必须在其所包含数据记录的更新值写到外存储器之前先写到稳固存储器上,即先写(write-ahead)日志规则。
UNDO(撤销)操作
对于要UNDo的事务T,日志中记录有
以及T对数据库的所有更新操作的日志记录。 UNDO过程为:从T的最后一条更新日志记录开始,从日志尾向日志头(反向)依次将T更新的数据元素值恢复为旧值(V1)。
REDO(重做)操作
与UNDO相反,REDO操作是对已提交事务进行重做,将数据库状态恢复到事务结束后的状态。
- 对于要REDO的事务T,日志中已经记录了
、T的所有更新操作日志以及 。 REDO过程为:从T的第一条更新日志记录开始,从日志头向日志尾(顺向)依次将T更新的数据元素值恢复为新值(V2)。
系统故障的恢复过程
分析阶段:
- 从日志头开始顺向扫描日志,确定重做事务集(REDO-set)和撤销事务集(UNDO-set)。将既有
又有 日志记录的事务T加入REDO-set;将只有 没有 日志记录的事务T加入UNDO-set。
- 从日志头开始顺向扫描日志,确定重做事务集(REDO-set)和撤销事务集(UNDO-set)。将既有
- 撤销阶段:
- 从日志尾反向扫描日志,对每一条属于UNDO-set中事务的更新操作日志依次执行UNDO操作
重做阶段:
日志文件恢复主要的两个问题:
- 日志扫描过程太耗时。因为日志文件必须保存在磁盘中,而且随着时间的不断推进,日志文件在不断扩大,扫描的时间也就变得越来越长。
- 许多要求REDO事务的更新实际上在恢复时都写入了磁盘的物理数据库中。尽管对它们做REDO操作不会造成不良后果,但会使恢复过程变得更长,导致数据库系统停止服务延长,从而降低了数据库的可用性。
- 检查点技术的目的:
- 减少扫描开销和提高恢复效率。
- 扫描点之前的事务该撤销的已经撤销,改重做的事务已经重做。
- 检查点是周期性地向日志中写一条检查点记录并记录所有当前活跃的事务,为恢复管理器提供信息,以决定从日志的何处开始恢复。
- 检查点的工作主要包括:
- 将当前位于日志缓冲区的所有日志记录输出到磁盘上;
- 将当前位于数据缓冲区的所有更新数据块输出到磁盘上;
- 记录日志记录
并输出到磁盘上,其中L是做检查点时活跃事务的列表。
- 在检查点执行过程中,不允许事务执行任何更新动作,如写缓冲块或写日志记录,称其为静态检查点技术。
- 如果事务T在做检查点之前就已提交,那么它的
记录一定出现在 记录前,并且其更新在做checkpoint时都已写到磁盘中,因此不需要对r做任何恢复操作,这样可大大减少恢复工作量。