事务的基本概念

事务

所谓事务就是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位

在SQl中,定义事务的语句一般有三条:

  • BEGIN TRANSACTION;

  • COMMIT:表示事务提交,具体地说就是将事务中所有对数据库的更新写到磁盘上的物理数据库中去,事务正常结束。

  • ROLLBACK:表示事务回滚,系统将事务中对数据库的所有已完成的操作全部撤销,回滚到事务开始时的状态。

事务的ACID特性

事务具有4个特性:原子性、一致性、隔离性和持续性。这四个特性简称ACID特性。

  1. 原子性:事务是数据库的逻辑工作单位,事务中包括的诸操作要么都做,要么都不做

  2. 一致性:事务执行的结果必须是是数据库从一个一致性状态变到另一个一致性状态

  3. 隔离性:一个事务的执行不能被其他事务干扰

  4. 持续性(永久性):事务一旦提交,他对数据库的改变就是永久性的

故障的种类

事物内部的故障

事物内部的故障是非预期的,是不能有应用程序处理的,事务故障仅指这类非预期的故障。最后会rollback撤销回来,这类恢复操作称为事务撤销。

系统故障

系统故障是指造成系统停止运转的任何事件,使得系统要重新启动。

介质故障

系统故障常称为软故障,介质故障称为硬故障。(一般与硬件有关)。

计算机病毒

人为破坏

总结

各类故障对数据库的影响有两种可能性,一是数据库本身被破坏,二是数据库没有被破坏,但数据可能不正确,这是由于事务的运行被非正常终止造成的。

恢复的实现技术

恢复机制涉及的两个关键问题是:如何建立冗余数据,以及如何利用这些冗余数据实施数据库恢复。

建立冗余数据最常用的技术时数据转储和登记日志文件。

数据转储

所谓转储即数据库管理员定期地将整个数据库复制到磁带、磁盘或其他存储介质上保存起来的过程。这些备用的数据称为后备副本或后援副本。

当数据库遭到破坏后可以将后备副本重新转入,但重装后备副本只能将数据恢复到转储时的状态,要恢复到故障发生时的状态,必须重新运行自转储以后的所有更新事务。

转储可以分为静态转储和动态转储。

  • 静态转储:系统无运行事务时进行的转储操作。

  • 动态转储:转储期间允许对数据库进行存取和修改

数据转储有两种方式,分别可以在两种状态下进行,因此数据转储方法可以分为4类:动态海量转储。动态增量转储、静态海量转储和静态增量转储。

转储方式 转储状态
动态转储 静态转储
海量转储 动态海量转储 静态海量转储
增量转储 动态增量转储 静态增量转储

登记日志文件

日志文件的格式和内容

日志文件是用来记录事务对数据库的更新操作的文件

日志文件的作用

日志文件在数据库恢复中起着非常重要的作用,可以用来进行事务故障恢复和系统故障恢复,并协助后备副本进行介质故障恢复。

登记日志文件

为保证数据库是可恢复的,登记日志文件必须遵循两条原则:

  • 登记的次序严格按并发事务执行的时间次序

  • 必须先写好日志文件,在写数据库

恢复策略

  • 事务故障的恢复

  • 系统故障的恢复

  • 介质故障的恢复:重装数据库,然后重做已完成的事务

具有检查点的恢复技术

检查点记录:增加一个重新开始文件,并让恢复子系统在登录日志文件期间动态的维护日志

检查点记录的内容包括:

  • 建立检查点时刻所有正在执行的事务清单

  • 这些事务最近一个日志记录的地址

动态维护日志文件的方法是,周期性地执行建立检查点、保存数据库状态的操作。

使用检查点方法可以改善恢复效率。

系统使用检查点方法进行恢复的步骤:

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

  • 由该检查点记录得到检查点建立时刻所有正在执行的事务清单ACTIVE-LIST。

    • 这里建立两个事务队列:

      • UNDO-LIST:需要执行UNDO操作的事务集合

      • REDO-LIST:需要执行REDO操作的事务集合

    • 把ACTIVE-LIST暂时放入UNDO-LIST队列,REDO队列暂时为空。

  • 从检查点开始正向扫描日志文件。

    • 如有新开始的事务T,把T暂时放入UNDO-LIST队列

    • 如有提交的事务T,把T从UNDO-LIST队列移到REDO-LIST队列;直到日志文件结束

  • 对UNDO-LIST中的每个事务执行UNDO操作,对REDO-LIST中的每个事务执行REDO操作。

数据库镜像

忧郁数据库镜像是通过复制数据实现的,频繁地复制数据自然会降低系统运行效率,因此在实际应用中用户往往只选择对关键数据和日志文件镜像镜像,而不是对整个数据库进行镜像。