在数据库运行过程中,数据库管理系统需要对数据库进行保护管理,以保证数据的正确性与一致性,避免数据丢失、泄露或遭到破坏。数据库保护主要是通过并发控制、数据恢复、安全性控制和完整性控制4个方面实现的。
本章主要讨论事务的基本概念与特性,并围绕如何保证事务的ACID(即原子性、一致性、隔离性、持久性)特性详细阐述并发控制技术,同时简单介绍数据恢复基本原理和技术。
事务
事务是一系列的数据库操作,是数据库应用程序的最小逻辑工作单位。事务处理技术主要包括数据库恢复技术和并发控制技术,它是恢复和并发控制的基本单位。
事务是用户定义的一个数据操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单元。
事务的开始与结束可以由用户显式控制。如果用户没有显式地定义事务,则由DBMS 按默认规定自动划分事务。在SQL中,定义事务的语句有三条:BEGIN TRANSACTION、COMMIT、ROLLBACK。 事务通常以 BEGIN TRANSACTION 开始,以 COMMIT 或 ROLLBACK结束,具体见以下两种方式。
(是以 ROLLBACK结束!而不是ROLLBACK TRANSACTION!)
方式一:
BEGIN TRANSACTION
SQL语句1
SQL语句2
COMMIT
commit语句用于提交事务
方式二:
BEGIN TRANSACTION
SQL语句1
SQL语句2
ROLLBACK
方式一中以COMMIT语句作为结束,表示提交事务的所有操作,即将事务中所有对数据库的更新写回到磁盘上的物理数据库中,该更新永久生效,事务正常结束。
方式二中以ROLLBACK语句作为结束,表示回滚,即在运行过程中发生了某种故障, 事务不能继续执行,系统将事务中对数据库的所有已完成的更新操作全部撤销,回滚到事务开始时的状态,事务异常终止。
事务的特征(ACID)
1、原子性(Atomicity)
事物的原子性是指事务是数据库的逻辑工作单位,事务的操作要么都做,要么都不做,即不允许事务部分完成。
2、一致性(Consistency)
事物的一致性是指事务执行的结果必须是使数据库从一个一致性状态转换到另一个一致性状态。
3、隔离性(Isolation)
事务的隔离性是指数据库中一个事务的执行不能受其他事务干扰,即一个事务内部的操作及使用的数据对其他事务是隔离的,并发执行的各个事务不能相互干扰。
4、持久性(Durability)
事务的持久性也称为永久性(Permanence),事务一旦提交,对数据库中的数据的改变就是永久性的,以后的操作或故障不会对事务的操作结果产生影响。
并发控制(并发操作)
在多用户数据库系统中,运行的事务很多。事务可以一个一个地串行执行,即每个时刻只有一个事务运行,其他事务必须等待这个事务结束后才能运行,这样可以有效地保证数据的一致性。但是串行执行使许多资源处于空闲状态。为了充分利用系统资源,发挥数据库共享资源的特点,应该允许多个事务并行执行。
(类似于操作系统中的顺序执行与并发执行)
并发操作引发的问题
以下三个是并发操作引发的问题,但是!它们没有破坏数据库的安全性!
1、丢失更新问题
(T2中的数据A没有得到更新)
2、读脏数据
(T1最后ROLLBACK导致C恢复15,但T2并不知道)
3、不可重复读
(T1中两次读出的数不同)
并发控制措施:封锁技术
在数据库环境下,进行并发控制的主要技术是封锁(Locking),就是事务T在对某个数据对象(如表、记录等)操作之前,先向系统发出请求,对其加锁。加锁后事务T就对该数据对象有了一定的控制,在事务T释放它的锁之前,其他的事务不能更新此数据对象。
确切的控制由封锁的类型决定。基本的封锁类型有两种:
排他锁(Exclusive Locks,简称X锁)和共享锁(Share Locks,简称S锁)。
1、排他锁
排他锁又称为写锁。 若事务T对数据对象A加上X锁,则只允许T读取和修改,其他任何事务都不能再对/加任何类型的锁, 直到T释放A上的锁。这就保证了其他事务在T释放S上的锁之前不能再读取和修改A。
2、共享锁
共享锁又称为读锁。 若事务T对数据对象A加上S锁,则事务T可以读但不能修改,其他事务只能再对A加S锁,而不能加X锁, 直到T释放A上的S锁。这就保证了其他事务可以读N,但在T释放A上的S锁之前不能对A进行任何修改。
封锁协议
在运用封锁方法对数据对象加锁时,还需要约定一些规则,如何时申请加锁、申请锁的类型、持锁时间、何时释放封锁等,我们称这些规则为封锁协议(Locking Protocol) 对封锁方式规定不同的规则,就形成了各种不同的封锁协议,不同的封锁协议又可以防止不同的错误发生。
1、一级封锁协议(修改数据前加X锁:解决丢失修改)
一级封锁协议是:事务T在修改数据A之前,必须先对其加X锁,直到事务结束才释放。事务结束包括正常结束(COMMIT)和非正常结束(ROLLBACK)。
一级封锁协议可防止“丢失修改”所产生的数据不一致性问题,并保证事务T是可恢复的。
在一级封锁协议中,如果仅仅是读数据而不对其进行修改,是不需要加锁的,所以它不能保证可重复读和不读“脏”数据。
(在该事务结束后就释放X锁)
2、二级封锁协议(一级+读取数据前加S锁:解决读“脏数据”)
一级封锁协议仅在修改数据之前对其加锁,而二级封锁协议则在一级封锁协议的基础上,加上了事务T在读取数据R之前必须先对其加S锁,读完后即可释放S锁的要求。
(加了X锁后不能再加其它任意锁,直到X锁被释放)
二级封锁协议除防止了丢失修改,还可进一步防止读“脏”数据。
3、三级封锁协议(一级+二级+:解决不可重复读)
并发操作所带来的三种数据不一致性问题,通过一级封锁协议和二级封锁协议已分别解决了丢失修改和读“脏数据”的问题。如果要解决不可重复读的问题则需要三级封锁协议。
三级封锁协议是:在一级封锁协议的基础上加上事务T在读取数据R之前必须先对其加S锁,并且直到事务结束才释放。
说明:二级与三级封锁协议的区别在于S锁释放的时间:二级是在操作结束后释放,三级是在事务结束后释放。
并发调度的可串行性
事务的执行次序称为“调度”。如果多个事务依次执行,则称为事务的串行调度。如果利用分时的方法,同时处理多个事务,则称为事务的并发调度。
多个事务的并发执行是正确的,当且仅当其结果与按某一顺序的串行执行的结果相同时,我们称这种调度策略为可串行化的调度。(可串行化调度与不可串行化调度)
串行调度和可串行化调度不是一个东西!串行调度就是多个事务依次执行,而可串行化调度是多个事务并发执行,它结果与某一顺序的串行执行的结果相同
(因为多个事务并发调度时,可能的并发调度数目远远大于n!所以需要引入可串行性来保证并发事务的正确性)
可串行性是并发事务正确性的准则。 这个准则规定,一个给定的并发调度,当且仅当它是可串行化的时,才认为是正确的调度。
两段锁协议
两段锁协议就是保证并发调度可串行性的一种封锁协议。
两段锁就是把事务分成了获得锁、释放锁,获得锁的过程中不能出现释放锁的操作,同样,在释放锁的过程中也不能出现有获得锁的操作!
某个并发事务遵守两段锁协议则它是可串行化调度,但不一定所有事务都符合两段锁协议!
(事务遵守两段锁协议是可串行化调度的充分条件:即:遵守两段锁协议->可串行化调度,反之不成立)
必要条件是推出的结论,充分条件是推出结论的前提
此外,要注意两段锁协议和防止死锁的一次封锁法的异同之处。
一次封锁法: 要求每个事务必须一次将所有要使用的数据全部加锁,否则就不能继续执行。因此,一次封锁法遵守两段锁协议。但是两段锁协议并不要求事务必须一次将所有要使用的数据全部加锁,因此遵守两段锁协议的事务仍然可能发生死锁。
数据恢复
虽然数据库系统中已采取一定的措施来防止数据库的安全性和完整性遭到破坏,保证并发事务的正确执行,但数据库中的数据仍然无法保证绝对不遭受破坏,如计算机系统中硬件的故障、软件的错误、操作员的失误、恶意的破坏等都有可能发生,这些故障的发生会影响数据库数据的正确性,甚至可能破坏数据库,使数据库中的数据全部或部分丢失。
因此,系统必须具有检测故障并把数据从错误状态恢复到某一正确状态的功能,这就是数据库的恢复。
数据库故障的类型
1、事务内部故障
2、系统故障
3、介质故障
4、计算机病毒
总结各类故障,对数据库的影响通常有两种可能性:一是数据库本身被破坏;二是数据库没有破坏,但数据可能不正确。
数据库恢复的基本原理和技术
数据库恢复的基本原理十分简单,就是数据的冗余。 数据库中任何一部分被破坏的或不正确的数据都可以利用存储在系统其他地方的冗余数据来修复。因此恢复系统应该提供两个关键问题的解决办法:一是如何建立冗余数据,即对可能发生的故障做某些准备;二是如何利用这些冗余数据实施数据库恢复。
1、建立冗余数据
最常用的技术:数据转储、登记日志文件。(常常结合在一起使用)
1)数据转储
数据转储是数据库恢复中采用的基本技术。转储,即DBA定期地将整个数据库复制到磁带或另一个磁盘上保存起来的过程。这些备用的数据文本称为后备副本。
转储是十分耗费时间和资源的,不能频繁进行。DBA应该根据数据库使用情况确定 一个适当的转储周期。
(转储可分为静态转储和动态转储)
- 登记日志文件
日志文件是用来**记录事务对数据库的更新操作的文件。**它包含数据库每次被修改项目的旧值和新值,目的是为数据库的恢复保留依据。不同的数据库系统采用的日志文件格式并不完全一样。概括起来,日志文件主要有两种格式:以记录为单位的日志文件和以数据块为单位的日志文件。
为保证数据库是可恢复的,登记日志文件时必须遵循两条原则:登记的次序严格按并发事务执行的时间次序;必须先写日志文件,后写数据库。
2、实施数据库恢复
当系统运行过程中发生故障时,利用数据库后备副本和日志文件就可以将数据库恢复策略到故障前的某个一致性状态。不同的故障其恢复策略和方法是不一样的。
1) 事务故障的恢复
事务故障是指事务在运行至正常终止点前被终止,这时恢复子系统应利用日志文件撤销此事务已对数据库进行的修改。事务故障的恢复是由系统自动完成的,不需要用户干预。
2) 系统故障的恢复
系统故障造成数据库不一致状态的原因有两个:一是未完成事务对数据库的更新可能已写入数据库;二是已提交事务对数据库的更新可能还留在缓冲区没来得及写入数据库。 因此,恢复操作就是要撤销故障发生时未完成的事务,重做已完成的事务。
3) 介质故障的恢复
发生介质故障后,磁盘上的物理数据和日志文件被破坏,这是最严重的一种故障。 恢复方法是重装数据库后备副本,然后重做已完成的事务。
练习题:
来源:oschina
链接:https://my.oschina.net/u/4400107/blog/4906918