目录
12.1 事务的基本概念
- DBMS运行的基本工作单位是事务。
- 事务是用户定义的一个数据库操作序列,这些操作序列要么全做,要么全不做,是一个不可分割的工作单位,事务和程序是两个不同的概念,一般一个程序可包含多个事务。一个事务由应用程序的一组操作序列组成,事务定义的语句如下:
(1)BEGIN TRANSACTION: 事务开始;
(2)END TRANSACTION: 事务结束;
(3)COMMIT:事务提交。该操作表示事务成功地结束,它将通知事务管理器该事务的所有更新操作现在可以被提交或永久地保留;
(4)ROLLBACK:事务回滚。该操作表示事务非成功地结束,它将通知事务管理器出故障了,数据库可能处于不一致状态,该事务的所有更新操作必须回滚或撤销。 - 事务状态:
如果不出现故障,那么所有事务都能执行完成。一旦在执行过程中发生故障,不能执行完成的事务称为中止事务;将中止事务对数据库的更新撤销称为事务回滚;成功执行完成的事务称为己提交事务。 - 中止的事务是可以回滚的,通过回滚恢复数据库,保持数据库的一致性,这是DBMS的责任。己提交的事务是不能回滚的,必须由程序员或DBA 手工执行一个“补偿事务”才能撤销提交的事务对数据库的影响。
- 为了更明确地描述事务的执行过程,一般将事务的执行状态分为五种:
(1)活动状态:事务的初始状态,事务执行时处于这个状态。
(2)部分提交状态:当操作序列的最后一条语句自动执行后,事务处于部分提交状态。这时事务虽然己经完全执行,但由于实际输出可能还临时驻留在内存中,在事务成功完成前仍有可能出现硬件故障,事务仍有可能不得不中止。因此,部分提交状态并不等于事务成功执行。
(3)失败状态:由于硬件或逻辑等错误,使得事务不能继续正常执行,事务就进入了失败状态处于失败状态的事务必须进行回滚 (ROLLBACK) 。这样,事务就进入了中止状态。
(4)中止状态:事务回滚并且数据库恢复到事务开始执行前的状态。可选重启事务或杀死事务。
(5)提交状态:当事务成功完成后,称事务处于提交状态。只有事务处于提交状态后,才能说事务已经提交。
12.2 数据库的并发控制
- 事务:由一系列操作组成,这些操作,要么全做,要么全不做,拥有四种特性,详解如下:(操作)原子性:要么全做,要么全不做。(数据)一致性:事务发生后数据是一致的,例如银行转账,不会存在A账户转出,但是B账户没收到的情况。(执行)隔离性:任一事务的更新操作直到其成功提交的整个过程对其他事务都是不可见的,不同事务之间是隔离的,互不干涉。(改变)持续性:事务操作的结果是持续性的。
- 事务是并发控制的前提条件,并发控制就是控制不同的事务并发执行,提高系统效率,但是并发控制中存在下面三个问题:
丢失更新:事务1对数据A进行了修改并写回事务2也对A进行了修改并写回此时事务2写回的数据会覆盖事务1写回的数据,就丢失了事务1对A的更新。即对数据A的更新会被覆盖
不可重复读:事务2读A,而后事务1对数据A进行了修改并写回,此时若事务2再读A,发现数据不对。即一个事务重复读A两次,会发现数据A有误。
读脏数据:事务1对数据A进行了修改后,事务2读数据A,而后事务1回滚,数据A恢复了原来的值,那么事务2对数据A做的事是无效的,读到了脏数据。
- X锁是排它锁(写锁)。若事务T对数据对象A加上X锁,则只允许T读取和修改其他事务都不能再对A加任何类型的锁,直到T释放A上的锁。
- S锁是共享锁(读锁)。若事务T对数据对象A加上S锁,则只允许T读取A,但不能修改A,其他事务只能再对A加S锁 (也即能读不能修改),直到T释放A上的S锁。
共分为三级封锁协议,如下:
一级封锁协议:事务在修改数据R之前必须先对其加X锁,直到事务结束才释放。可解决丢失更新问题:
二级封锁协议:
一级封锁协议的基础上加上事务T在读数据R之前必须先对其加S锁,读完后即可释放S锁。
可解决丢失更新、读脏数据问题:
三级封锁协议:
级封锁协议加上事务T在读取数据R之前先对其加S锁,直到事务结束才释放可解决丢失更新读脏数据、数据重复读问题
- 串行调度(serial schedule) 是指多个事务依次串行执行,且只有当一个事务的所有操作都执行完后才执行另一个事务的所有操作。
- 并发调度 (concurrent schedule): 利用分时的方法同时处理多事务”其执行的结果与串行调度执行的结果相同,则称这个并发调度是正确的。可恢复调度:若事务Ti提交失败,则应当撤销Ti的影响以保证其原子性。在允许并发执行的系统中,还必须确保依赖于Ti的任何事务也中止。例如,Ti要读Ti写的数据,则称T 依赖于Ti。
- 可恢复调度(recoverable schedule) 应满足: 当事务 要读事务Ti 写的数据时,事务Ti必须要先于事务Ti 提交
- 可串行化的调度:多个事务的并发执行是正确的当且仅当其结果与某一次序串行地执行它们时的结果相同,称这种调度策略是可串行化的调度(serializability schedule)。
- 冲突可串行化
冲突 (conflict):当li和li是不同事务在相同的数据项上操作的命令,月至少有一个是write 命令时,则称i与ii是冲突的。 - 等价调度:设l与i是调度S 的两条连续的命令,若与是不同事务的命令且不冲突,则可以交换li与ij的顺序得到一个新的调度S*。我们称S 与S*是等价的。
【两段锁协议】
- 两段锁协议:是指对任何数据进行读写之前必须对该数据加锁在释放一个封锁之后,事务不生长阶段(加锁、扩展阶段)再申请和获得任何其他封锁。每个事务的执行可以分为两个阶段和衰退阶段 (解锁、收缩阶段)。
- 加锁阶段:在该阶段可以进行加锁操作。在对任何数据进行读操作之前要申请并获得S锁,在进行写操作之前要申请并获得X锁。加锁不成功,则事务进入等待状态,直到加锁成功才继续执行。
- 解锁阶段:当事务释放了一个封锁以后,事务进入解锁阶段,在该阶段只能进行解锁操作不能再进行加锁操作
- 如果事务部遵循两段锁协议,那么它们的并发调度是可串行化的。两段锁是可串行化的充分条件,但不是必要条件。需要注意的是采用两段锁协议也有可能产生死锁,这是因为每个事务都不能及时解除被它封锁的数据,可能会导致多个事务互相都要求对方己封锁的数据不能继续运行。
- 封锁的粒度封锁的粒度是被封锁数据目标的大小,在关系数据库中封锁粒度有属性值、属性值集、元组关系、索引项、整个关系数据库等几种。
- 封锁粒度小则并发性高,但开销大,封锁粒度大则并发性低,但开销小。
【数据库事务的四种隔离级别】
数据库事务的四种隔离级别数据库事务的隔离级别有4个,由低到高依次为Readuncommitted、Read committed.Repeatable read、Serializable.
- READ UNCOMMITTED:读未提交,这是事务最低的隔离级别,它允许另外一个事务可以看到这个事务未提交的数据
- READ COMMITTED: 读提交,保证一个事务修改的数据提交后才能被另外一个事务读取另外一个事务不能读取该事务未提交的数据。解决丢失更新、读脏数据问题。
- REPEATABLE READ:重复读,在开始读事务时,不允许修改操作。进一步解决了不可重复读问题。
- SERIALIZABLE:这是花费最高代价但是最可靠的事务隔离级别。事务被处理为串行化执行。
12.3 数据库的故障与恢复
12.3.1 事务故障
- 数据库故障主要分:事务故障、系统故障和介质故障。
- 事务故障:是由于程序执行错误而引起事务非预期的、异常终止的故障。通常有如下两类错误引起事务执行失败。
(1)逻辑错误。如非法输入、找不到数据、溢出、超出资源限制等原因引起的事务执行失败(2)系统错误。系统进入一种不良状态(如死锁),导致事务无法继续执行 - 对于不可以预期的错误应用程序无法处理,是由DBMS 系统实现故障恢复的。如非法输入、运算溢出等。非预期的故障如非法输入是由约束机制检查并恢复的。事务故障通常指非预期的故障事务故障意味着事务没有达到预期的终点,因此数据库可能处于不正确状态。恢复程序要在不影响其他事务运行的情况下,强行回滚该事务,即撤销该事务己经做出的任何对数据库的修改,这类恢复操作称为事务撤销 (UNDO)。
恢复过程:
(1)反向 (从后向前)扫描日志文件查找该事务的更新操作;
(2)对该事务的更新操作执行逆操作,也就是将日志记录更新前的值写入数据库;
(3)继续反向扫描日志文件,查找该事务的其他更新操作,并作同样处理;
(4)如此处理下去,直到读到了此事务的开始标记,事务故障恢复就完成了。 - 事务故障的恢复由系统自动完成,对用户是透明的。
12.3.2 系统故障
系统故障(通常称为软故障):是指硬件故障、软件(如DBMS、OS 或应用程》漏的影响,导致丢失了内存中的信息,影响正在执行的事务,但未破坏存储在外存上的信息。这种情况称为故障 - 停止假设。
- 系统故障会使数据库的数据不一致,原因有两个:
(1)是未完成的事务对数据库的更新可能己写入数据库;
(2)是己提交的事务对数据库的更新可能还在缓冲区中没来得及写入数据库。因此恢复操作就是要撤销故障发生时未完成的事务,重做 (REDO) 已提交的事务。 - 恢复过程:
(1)正向 (从头到尾)扫描日志文件,找出故障发生前已经提交的事务 (这些事务既有BEGINTRANSACTION 记录,也有COMMIT记录),将其事务标识记入重做 (REDO) 队列。同时找出故障发生时尚未完成的事务 (这些事务只有BEGIN TRANSACTION 记录,无相应的COMMIT记录),将其事务标识记入撤销 (UNDO) 队列;
(2)反向扫描日志文件,对每个UNDO事务的更新操作执行逆操作,也就是将日志记录中更新前的值写入数据库。对每个REDO事务重新执行日志文件登记的操作,也就是将日志记录中更;
(3)正向扫描日志文件,新后的值写入数据库。 - 系统故障是在系统重启之后自动执行的,对用户是透明的
12.3.3 介质故障
介质故障(称为硬件故障):是指外存故障,例如磁盘损坏、磁头碰撞,瞬时强磁场干扰等。这类故障将破坏数据库或部分数据库,并影响正在存取这部分数据的所有事务,日志文件也被破坏。
- 恢复过程:
(1)装入最新的数据库后备副本,使数据库恢复到最近一次转储时的一致性状态;
(2)转入相应的日志文件副本,重做已完成的事务。 - 介质故障的恢复需要DBA的介入,具体的恢复操作仍由DBMS完成。
12.3.4 数据库备份
- 静态转储:即冷备份,指在转储期间不许对数据库进行任何存取、修改操作;优点是非常快速的备份方法、容易归档(直接物理复制操作);缺点是只能提供到某一时间点上的恢复,不能做其他工作,不能按表或按用户恢复。
- 动态转储:即热备份,在转储期间允许对数据库进行存取、修改操作,因此,转储和用户事务可并发执行,优点是可在表空间或数据库文件级备份,数据库仍可使用,可达到秒级恢复;缺点是不能出错,否则后果严重,若热备份不成功,所得结果几平全部无效。
- 海量转储和增量转储。海量转储是指每次转储全部数据,增量转储是指每次只转储上次转储后更新过的数据。
● 完全备份:备份所有数据。
● 差量备份:仅备份上一次完全备份之后变化的数据。
● 增量备份:备份上一次备份之后变化的数据。 - 日志文件
● 在事务处理过程中,DBMS把事务开始、事务结束以及对数据库的插入、删除和修改的每一次操作写入日志文件。一旦发生故障,DBMS的恢复子系统利用日志文件撤销事务对数据库的改变回退到事务的初始状态。
● 备份毕竟是有时间节点的,不是实时的,例如:上一次备份到这次备份之间数据库出现了故障则这期间的数据无法恢复,因此,引入日志文件,可以实时记录针对数据库的任何操作,保证数据库可以实时恢复。 - 数据库镜像:
根据DBA的要求,自动把整个数据库或其中的关键数据复制到另一个磁盘上。DBMS自动保证镜像数据与主数据的一致性。
作用:用于数据库的恢复;用于并发操作。
12.4 数据库的安全性与完整性
- 恶意访问的形式主要包括: 未经授权读取数据(窃取信息);未经授权修改数据,未经授权破坏数据。
- 数据库安全性(data base security) 指保护数据库不受恶意访问。为了保护数据库的安全可以在以下五个层次上采取安全性措施:
(1)数据库系统层次 (database system)。数据库系统的某些用户获得的授权可能只允许他访问数据库中有限的部分,而另外一些用户获得的授权可能允许他提出查询,但不允许他修改数据保证这样的授权限制不被违反是数据库系统的责任。
(2)操作系统层次 (operating system)。不管数据库系统多安全,操作系统安全性方面的弱点总是可能成为对数据库进行未授权访问的一种手段。
(3)网络层次(network)。由于几乎所有的数据库系统都允许通过终端或网络进行远程访问网络软件的软件层安全性和物理安全性一样重要,不管在因特网上还是在私有的网络内。
(4)物理层次(physical)。计算机系统所位于的结点(一个或多个)必须在物理上受到保护,以防止入侵者强行闯入或暗中潜入。
(5)人员层次(human)。对用户的授权必须格外小心,以减少授权用户接受贿赂或其他好处而给入侵者提供访问机会的可能性。 - 为了保证数据库安全,用户必须在上述所有层次上进行安全性维护。如果较低层次上(物理层次或人员层次)安全性存在缺陷,高层安全性措施即使很严格也可能被绕过。下面主要在数据库系统层次上讨论安全性,主要包括: 权限机制、视图机制和数据加密。
- 授权:通过DBMA提供的授权功能赋予用户在数据库各个部分上的几种形式的授权,其中包括read、insert、update、 delete。
- 用户还可以获得修改数据库模式的授权: index 授权允许创建和删除索引。resource 授权允许创建新关系。alteration 授权允许添加或删除关系中的属性。drop 授权允许删除关系。
- 用户角色是具有相同操作权限的用户集合,不同角色的用户授予不同的数据管理和访问操作权限。一般可以将权限角色分为三类: 数据库登录权限类、资源管理权限类、DBA权限类。
- 存取控制(数据授权):数据库授权可以分为静态授权和动态授权:
● 静态授权是DBMS的隐性授权,也即用户对于本身所拥有的信息是不需要有指定的授权动作就拥有管理和操作权限的。
● 动态授权指数据对象的所有者或者DBA默认的拥有对数据的存取权,允许他们把这些权利授子其他的用户。 - 访问控制可以对用户访问的数据对象进行控制,数据对象粒度从大到小分为如下四个级别:数● 据库级别;
● 表级,判断用户是否可以访问关系里面的内容;
● 记录级,判断用户是否能访问关系中的一行记录的内容属性级,判断用户是否能访问某列的内容。 - 视图控制:建立视图,将表中的数据按应用展现和隐藏,有助于隐藏表中的关键信息,增强安全性。
- 审计功能:是一种事后监督的手段。审计作为一种安全检查的措施,会把系统的运行状况和用户访问数据库的行为记录以日志保存下来,该日志作为稽查用户行为的一种证据。数据库系统的审计工作包括: 设备安全审计、操作审计、应用设计、攻击审计
- 数据加密:防止数据库的敏感信息在存储和传输过程中被窃取的有效手段。包括数据传输加密技术、数据存储加密技术、数据完整性鉴别技术、密钥管理技术。
【软考数据库】第一章 计算机系统基础知识
【软考数据库】第二章 程序语言基础知识
【软考数据库】第三章 数据结构与算法
【软考数据库】第四章 操作系统知识
【软考数据库】第五章 计算机网络
【软考数据库】第六章 数据库技术基础
【软考数据库】第七章 关系数据库
【软考数据库】第八章 数据库SQL语言
【软考数据库】第九章 非关系型数据库NOSQL
【软考数据库】第十章 系统开发与运行
【软考数据库】第十一章 数据库设计