第8章数据库事务管理 重点_第1页
第8章数据库事务管理 重点_第2页
第8章数据库事务管理 重点_第3页
第8章数据库事务管理 重点_第4页
第8章数据库事务管理 重点_第5页
已阅读5页,还剩67页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第第8 8章章 数据库事务管理数据库事务管理n事务定义n事务是构成数据库处理逻辑单元的可执行程序,由用户定义的一组操作序列(包括插入、删除、修改或检索等操作)组成,序列中的操作要么都做,要么都不做,是一个不可分割的工作单位。事务概念n 事务特性(ACID)n原子性原子性(Atomicity)事务中包含的所有操作要么全做,要么全不做原子性由恢复机制恢复机制实现n一致性一致性(Consistency)事务的隔离执行必须保证数据库的一致性事务开始前,数据库处于一致性的状态;事务结束后,数据库必须仍处于一致性状态数据库的一致性状态由用户用户来负责,由并发控制并发控制机制机制实现如银行转帐,转帐前后两个

2、帐户金额之和应保持不变(意大利香肠)事务概念n隔离性隔离性(Isolation)系统必须保证事务不受其它并发执行事务的影响对任何一对事务T1,T2,在T1看来,T2要么在T1开始之前已经结束,要么在T1完成之后再开始执行隔离性通过并发控制机制并发控制机制实现n持久性持久性(Durability)一个事务一旦提交之后,它对数据库的影响必须是永久的系统发生故障不能改变事务的持久性持久性通过恢复机制恢复机制实现8.1.2可串行性理论可串行性理论可串行性通常看作是多个事务并发执行的正确性准则。具体判定方法如下:n各单个事务如能将数据库从一个正确状态转变为另一个正确状态,则认为该事务是正确的; n按任何

3、一个串行顺序依次执行多个事务也是正确的(这里的串行顺序假定各个事务间彼此独立、不交叉); n事务的交叉执行过程是正确的,当且仅当其与串行执行过程等价,则事务是可串行化的。 8.2并发控制8.1.3 8.1.3 事务基本操作与活动状态事务基本操作与活动状态n1.事务操作的组成n事务操作可以看做若干部分组成n(1)事务开始(BEGIN TRANSACTION):事务开始执行;n(2)事务读写操作(READ/WRITE TRANSACTION):事务进行数据操作n(3)事务提交(COMMIT TRANSACTION ):事务完成所以数据操作,同时保存操作结果,它标志着事务成功完成。n(4)事务回滚(

4、ROLLBACK TRANSACTION ):事务未完成所有数据操作,重新返回到事务开始状态,标志着事务的撤销。事务的活动状态事务的活动状态非正常结束正常结束8.28.2 并发控制与封锁机制并发控制与封锁机制8.2.1 并发操作与数据的不一致性并发操作与数据的不一致性 并发操作可能带来的数据不一致性情并发操作可能带来的数据不一致性情况有三种况有三种: : 丢失修改、读丢失修改、读“脏脏”数据数据和不可重复和不可重复读。读。 78.2.2封锁 n排他锁和共享锁 n封锁协议 n活锁和死锁 8.2并发控制n当需要查询或更新数据时,先对数据进行封锁,以避免来自其他事务的干扰。针对不同的干扰问题可以有不

5、同的封锁机制。 n以丢失更新问题为例,实施封锁的基本思想是:当一个用户对一个表或记录进行更新时,封锁该表或记录,使其他用户不能在同一时刻更新相同的表或记录,迫使其他用户在更新后的基础上(而不是在更新前的基础上)再实施另外的更新操作。 实施封锁以后的时间序列1.排排他他锁和共享锁锁和共享锁n共享锁 n排他锁 有些封锁在执行完相应操作后就自动释放封锁,有些封锁则保持到事务结束(提交或撤消)时才释放(无论如何,所有的封锁都会在事务结束时自动释放)。 (1)共享锁 n共享封锁是为读操作设置的一种封锁,所以也称作读封锁,或简称S锁,目的是想读到一组不变的数据,也就是在读数据的过程中,不允许其他用户对该数

6、据进行任何修改操作。这种封锁可以保证最大的并发性,任何数量的用户都可以同时对同样的数据施加这种共享锁。已经实施共享锁的表拒绝来自其他事务的独占封锁和更新封锁。 (2)排他锁 n排他锁也叫独占锁,它是为修改操作设置的一种封锁,也称为写封锁,或简称为X锁,这是最严格的一类封锁。当需要对表实施插入、删除或修改操作时,应该使用独占封锁。已经实施独占封锁的表,拒绝来自其他用户的任何封锁,但不拒绝一般的查询操作。 . 封锁协议所谓封锁协议就是在对数据对象加锁、持锁和释放锁时所约定的一些规则。n(1)一级封锁协议一级封锁协议规定事务 T 在更新数据对象以前,必须对该数据对象加排它锁,并且直到事务 T 结束时

7、才可以释放该锁。利用一级封锁协议可以防止丢失更新问题的发生。 14n(2)二级封锁协议二级封锁协议规定事务 T 在更新数据对象以前必须对数据对象加 X 锁 ,且直到事务 T 结束时才可以释放该锁,还规定事务 T 在读取数据对象以前必须先对其加 S 锁,读完后即可释放 S 锁。可以防止丢失更新问题,还可以防止读“脏”数据问题,但却不能解决不可重复读问题。15二级封锁协议16t1t2t3t4时间时间事务事务1事务事务2Lock Lock,Wait UnlockLock UnLockt5修改数据加X锁,读数据时加S锁,读完读完即释放。没有丢失修改,不会读到“脏”数据。但不能重复读但不能重复读。n(3

8、)三级封锁协议 三级封锁协议规定事务 T 在更新数据对象以前,必须对数据对象加 X 锁,且直到事务 T 结束时才可以释放该锁,还规定事务 T 在读取数据对象以前必须先对其加 S 锁,该 S 锁也必须在事务 T 结束时才可释放。可以防止丢失更新和读“脏”数据问题,此外还可以防止不可重复读问题的发生。17(3)更新封锁 n当需要对一个记录或一组记录进行更新时(只是修改,不包括插入和删除)使用更新封锁,该封锁的目的是防止其他用户在同一时刻修改同一记录。已经实施更新封锁的记录,拒绝来自其他用户的任何封锁,但不拒绝一般的查询操作。 3)SQL Server中与封锁有关的命令 nSQL Server的封锁

9、操作是在相关语句的“WITH ()”子句中完成的,该短语可以在SELECT、INSERT、UPDATE和DELETE等语句中指定表级锁定的方式和范围。3)SQL Server中与封锁有关的命令n常用的封锁关键词有:nTABLOCK:对表施行共享封锁,在读完数据后立刻释放封锁,此类封锁可以避免读“脏”数据,但不具有可重复读的特性。 nHOLDLOCK:与TABLOCK一起使用,可将共享锁保留到事务完成,而不是在读完数据后立即释放锁,这样可以保证数据的可重复独特性。 nNOLOCK:不进行封锁,此关键词仅应用于SELECT语句,这样可能会读取未提交事务的数据,即有可能发生“脏”读。 nTABLOC

10、KX:对表实施独占封锁。 nUPDLOCK:对表中的指定元组实施更新封锁;这时其他事务可以对同一表中的其他元组也实施更新封锁,但是不允许对表实施共享封锁和独占封锁。 3)SQL Server中与封锁有关的命令DECLARE d datetime, t char(6), s char(2), n char(10)BEGIN TRANSACTIONSELECT n=座位号 FROM R WITH (UPDLOCK)WHERE 日期 = d AND 车次 = t AND 座别 = s AND 状态 IS NULLIF UPDATE R SET 状态 = Y WHERE 座位号 = n AND 日期

11、= d AND 车次 = t AND 座别 = sCOMMIT TRANSACTIONELSEROLLBACK TRANSACTION4)封锁粒度 n封锁的对象可以是表、也可以是元组等,我们把封锁对象的大小称为封锁粒度(Granularity)。n封锁的对象可以是逻辑单元(如表和元组等),也可以是物理单元(如数据页和数据块等)。n数据库管理系统一般都具有多粒度锁定功能,允许一个事务锁定不同类型的资源。 4)封锁粒度n锁定在较小的粒度(例如行)可以增加并发操作的性能,但系统开销也较大。这是因为如果封锁的粒度小,则意味着需要的锁多,从而需要系统控制更多的锁。 n锁定在较大的粒度(例如表)会降低操作

12、的并发性,这是因为锁定整个表限制了其他事务对表中任意部分进行访问。封锁粒度大,则不需要太多的封锁,由于需要维护的锁较少,所以系统开销较低。 5)意向锁 n为了降低封锁的成本,提高并发的性能,数据库管理系统还支持一种意向锁(Intention Lock)。 n意向锁表示一种封锁意向,当需要在某些底层资源上(如元组)获取封锁时,可以先对高层资源(如表)实施意向锁。例如,在表级实施共享意向锁表示事务打算在表中的元组上实施共享锁,这样做可以防止另一个事务随后在同样的资源上获取排它锁。意向锁可以提高性能,因为系统仅在表级检查意向锁来确定事务是否可以安全地获取该表上的锁;而无须检查表中的每个元组上的锁,以

13、确定事务是否可以锁定整个表。 5)意向锁n意向共享(IS) n意向排它(IX) n共享意向排它(SIX) (1)意向共享(IS) n通过在各资源上放置IS锁,表明事务的意向是读取层次结构中的部分(而不是全部)底层资源。 n例如,对表实施IS锁,则意味着要对表中的某个(些)元组实施S锁;n或者说,当需要对表中的某个(些)元组实施S锁时,应该首先对表实施IS锁。 (2)意向排它(IX) n通过在各资源上放置IX锁,表明事务的意向是修改层次结构中的部分(而不是全部)底层资源。n例如,对表实施IX锁,则意味着要对表中的某个(些)元组实施X锁;n或者说,当需要对表中的某个(些)元组实施X锁时,应该首先对

14、表实施IX锁。 (3)共享意向排它(SIX) n通过在各资源上放置SIX锁,表明事务的意向是读取层次结构中的全部底层资源并修改部分(而不是全部)底层资源。 nSIX锁等同于加S锁、再加IX锁。n例如,对表实施SIX锁,则意味着要对表实施S锁,并对表中的某个(些)元组实施X锁;n或者说,当需要对表实施S锁,并对表中的某个(些)元组实施X锁时,应该首先对表实施SIX锁。 8.2.4死锁 n产生死锁的原因 n避免死锁 n发现死锁n解决死锁 1)产生死锁的原因n右图示意了两个并发事务所发生事件的序列,假设程序A为了完成某个事务需要封锁仓库和职工两个关系,而几乎在同一时刻并发执行的程序B为完成另一个事务

15、也需要封锁职工和仓库关系,这两个程序正好按照如图所示的交错序列执行命令,结果两个程序都为了等待对方释放数据资源而产生死锁。 2)避免死锁 n相同顺序法 n所有的用户程序约定都按相同的顺序来封锁表 n一次封锁法 n为了完成一个事务,一次性封锁所需要的全部表 n两阶段封锁协议 n所有事务都必须将对数据的封锁分为封锁和释放两个阶段 避免死锁的封锁 两阶段封锁协议 n第一阶段称为扩展阶段,这一阶段获得各种类型的封锁,但是不能释放任何封锁。n第二阶段称为收缩阶段,这一阶段释放各种类型的封锁,一旦开始释放封锁,则不能再申请任何类型的封锁。 n注意,两阶段封锁协议和一次封锁法的异同之处。一次封锁法遵守两阶段

16、封锁协议;但是两阶段封锁协议并不要求一次封锁所有需要封锁的数据。两阶段封锁协议仍有可能发生死锁。 3)(A)发现死锁n超时法 n即一个事务在等待的时间超过了规定的时限后就认为发生了死锁。 n这种方法非常不可靠,如果设置的等待时限长,则不能及时发现死锁;如果设置的等待时限短,则可能会将没有发生死锁的事务误判为死锁。 3)(A)发现死锁n等待图法 n即通过有向图判定事务是否是可串行化的,如果是则说明没有发生死锁,否则说明发生了死锁。n具体思路是:用节点来表示正在运行的事务,用有向边来表示事务之间的等待关系,如右图所示,如果有向图中发现回路,则说明发生了死锁。3)(B)解决死锁n发现死锁后解决死锁的

17、一般策略是:自动使“年轻”的事务(即完成工作量少的事务)先退回去,然后让“年老”的事务(即完成工作量多的事务)先执行,等“年老”的事务完成并释放封锁后,“年轻”的事务再重新执行。 8.2.5隔离级别(1) n隔离性虽然是事务的基本性质之一,但是彻底的隔离意味着并发操作效率的降低。所以人们设想在避免干扰的前提下,适当地降低隔离的级别,从而提高并发的操作效率。隔离级别越低,并发操作的效率越高,但是产生干扰的可能性也越大;隔离级别越高,则并发操作的效率越低,同时产生干扰的可能性也越小。在设计应用时,可以在所能容忍的干扰程度范围内,尽可能的降低隔离级别,从而提高应用的执行效率。 8.2.5隔离级别(2

18、)n在SQL标准中定义了下列四种隔离级别,SQL Server支持所有这些隔离级别: n未提交读(READ UNCOMMITTED):事务隔离的最低级别,仅可保证不读取物理损坏的数据,这是四个隔离级别中限制最小的级别。 n提交读(READ COMMITTED):SQL Server默认级别,可以保证不读取“脏”数据。 n可重复读(REPEATABLE READ):可以保证读一致性,避免不一致分析问题。 n可串行化(SERIALIZABLE):事务隔离的最高级别,事务之间完全隔离;如果事务在可串行化隔离级别上运行,则可以保证任何并发重叠事务均是串行的。 8.2.5隔离级别(3)四种隔离级别所允许

19、的不同类型的行为 事务必须运行于可重复读或更高的隔离级别才可以防止丢失更新。 8.2.5隔离级别(4)n设置隔离级别的命令是: SET TRANSACTION ISOLATION LEVEL READ COMMITTED | READ UNCOMMITTED | REPEATABLE READ | SERIALIZABLE 8.2.6封锁与隔离级别 (1)n可以通过指定隔离级别或对数据资源实施封锁达到事务隔离的目的;n封锁是实现并发操作的传统方法(在SQL标准中没有提及封锁),适当的运用封锁并保证高并发操作性能是一件非常复杂的工作,这需要用户深入了解各种封锁的相容性,并设计封锁的调度策略;nS

20、QL标准中规定了事务的隔离级别,即未提交读、提交读、可重复读和可串行化,隔离级别解决了并发事务可能产生的丢失更新问题、未提交依赖问题、不一致分析问题和幻象读问题,其中为了避免丢失更新问题,事务必须运行在可重复读或可串行化隔离级别。 n用户可以根据事务的需要设定隔离级别,结果由数据库管理系统控制封锁和进行并发操作调度。 8.2.6封锁与隔离级别(2)n在实际应用中,也可以将隔离级别和封锁结合起来使用。例如,如果指定隔离级别是可重复读,则SQL会话中所有SELECT语句的锁定行为都运行于该隔离级别上,并一直保持有效,直到会话终止或者将隔离级别设置为另一个级别。如果必要,可以通过指定表级封锁来替代单

21、个SELECT语句的隔离级别,指定表级封锁不会影响会话中的其他语句。一般仅在绝对必要时才使用表级封锁更改默认的锁定行为。 8.3恢 复 n故障类型 n备份类型 n日志的概念 n恢复模型 n备份或转储 n恢复或还原 8.3.2故障类型n造成事务中断的故障 n突然掉电引起的事务中断 n硬件故障引起的事务中断 n客户应用程序出错引起的事务中断 n系统程序故障引起的事务中断 n磁盘介质故障 8.3.3备份类型 n双机热备份 n双工备份 n磁盘镜像 n数据库备份技术 8.3.4日志的概念 n日志则是对备份的补充,它可以看作是一个值班日记,它将记录下所有对数据库的更新操作。这样就可以在备份完成时立刻刷新并

22、启用一个数据库日志,数据库日志是实时的,它将忠实地记录下所有对数据库的更新操作。n当磁盘出现故障造成数据库损坏时,就可以首先利用备份恢复数据库(恢复大部分数据),然后再运行数据库日志,即将备份后所做的更新操作再重新做一遍,从而将数据库完全恢复。n为了保证日志的安全,应该将日志和主数据库安排在不同的存储设备上,否则日志和数据库可能会同时遭到破坏,日志也就失去了它本来的作用。 8.3.5恢复模型 (1)n简单恢复模型n允许将数据库恢复到最新的备份,即使用简单恢复模型可以将数据库恢复到上次备份的即时点,而无法将数据库恢复到故障点或特定的即时点。使用简单恢复模型,日志实际失去了作用。使用简单恢复模型的

23、数据库只能做数据库备份,不能做日志备份。n完全恢复模型n允许将数据库恢复到故障点状态,即完全恢复模型使用数据库备份和事务日志备份提供对介质故障的完全防范。8.3.5恢复模型(2)n可以使用ALTER DATABASE语句的RECOVERY子句设置恢复模型。n例如,如下语句将订货数据库的恢复模型设置为完全恢复: ALTER DATABASE 订货 SET RECOVERY FULL8.3.6备份或转储 n备份的类型 n动态备份和静态备份 n制定备份的策略 n备份整个数据库 n增量备份 n事务日志备份 n文件和文件组备份 n系统数据库的备份 1)备份的类型 n全备份:即完整的备份整个数据库;n增量

24、备份:增量数据库备份只备份自上次数据库备份后发生更改的数据;n文件和文件组备份:备份数据库文件或文件组,而不是备份数据库;n事务日志备份:只备份事务日志。 2)动态备份和静态备份n动态备份也称作在线备份,即在做备份时不中断数据库的运行,不中断数据库上的应用程序和事务处理。 n静态备份也称作离线或脱机备份,这意味着在做备份时没有任何数据库事务在运行,这种备份方式应是首选的备份方式。 3)制定备份的策略 n备份不是实时的,备份应该什么时候做?用什么方式做?这根据数据库的不同规模、不同用途,可能有很多因素需要考虑和衡量。 4)备份整个数据库(1) n在SQL Server中系统管理员和数据库管理员可

25、以进行备份,也可以指定某个用户担当db_backupoperator角色(数据库预定义角色)来负责数据库的备份工作。 n所有的备份工作可以在“企业管理器”中利用交互工具完成,也可以使用命令方式完成。 4)备份整个数据库(2)n备份数据库的命令是BACKUP DATABASE,一般格式如下: BACKUP DATABASE database_name TO DISK | TAPE =physical_backup_device_namen例如,如下命令将订货数据库备份到C:dumpdump1.bak: BACKUP DATABASE 订货 TO DISK=C:dumpdumpfull.bak5)

26、增量备份 n增量备份的命令也是BACKUP DATABASE,一般格式如下: BACKUP DATABASE database_name TO DISK | TAPE =physical_backup_device_name WITH DIFFERENTIALn例如,如下命令将对订货数据库做增量备份(备份到C:dumpdump1.bak): BACKUP DATABASE 订货 TO DISK=C:dumpdump1.bak WITH DIFFERENTIAL6)事务日志备份(1) n备份事务日志的命令是BACKUP LOG,一般格式是: BACKUP LOG database_name TO

27、 DISK | TAPE =physical_backup_device_name n例如,如下命令将备份订货数据库的日志(备份到C:dumpdumplog.bak): BACKUP LOG 订货 TO DISK=C:dumpdumplog.bak截断日志 n截断日志的命令是: BACKUP LOG database_name WITH TRUNCATE_ONLYn例如,在备份了订货数据库或事务日志后,为了截断订货管理数据库的事务日志可以使用如下命令: BACKUP LOG 订货 WITH TRUNCATE_ONLY7)文件和文件组备份 (1)n可以备份和恢复数据库中的个别文件,这样当遇到介质

28、故障时可以只恢复已损坏的文件,而不用恢复数据库的其余部分,从而加快了恢复速度。 n对于超大型数据库,有时不可能完成完整数据库的备份,这样则可以使用文件备份。文件备份为数据库备份提供了一种灵活的手段。 n与数据库备份相比,文件备份的主要缺点是增加了管理的复杂性。必须注意维护完整的文件备份集和所覆盖的日志备份。 文件和文件组备份(2)n备份文件或文件组的一般命令格式是: BACKUP DATABASE database_nameFILE = logic_file_list | FILEGROUP = filegroup_list T O D I S K | T A P E =physical_ba

29、ckup_device_name WITH DIFFERENTIAL 文件和文件组备份(3)n例如,如下命令完成对订货数据库warehouse文件的备份: BACKUP DATABASE 订货 FILE = warehouse TO DISK =C:dumpfile_1.bakn如下命令则完成对订货数据库文件组仓库的备份: BACKUP DATABASE 订货 FILEGROUP = 仓库 TO DISK =C:dumpfile_g.bak8)系统数据库的备份 n数据库备份不仅仅是要备份用户数据库,系统数据库也需要备份,例如SQL Server中的master、model和msdb等系统数据库

30、。特别是master数据库,它负责整个数据库的管理,所有用户创建的数据库以及用户登录信息都存储在该数据库中。所以,该数据库一旦损坏,整个系统的使用都将受到影响。 8.3.7恢复或还原n恢复整个数据库 n恢复数据库的部分内容 n恢复特定的文件或文件组 n恢复事务 可以将数据库恢复到做备份的即时点、发生故障的即时点或特定的事务即时点。 8.3.7恢复或还原n根据数据库全备份进行恢复 n根据增量备份进行恢复 n根据事务日志进行恢复 n根据文件或文件组备份进行恢复 n恢复系统数据库 1)根据数据库全备份进行恢复RESTORE DATABASE database_nameFROM DISK | TAPE

31、 =physical_backup_device_name WITH , NORECOVERY | RECOVERY , REPLACE 2)根据增量备份进行恢复 n在简单恢复模型和完全恢复模型中都可以选择增量备份,如果存在增量备份,则一般需要进行相应的恢复操作。 n增量恢复数据库的命令也是RESTORE DATABASE,但是在根据增量备份继续恢复之前应该:已经使用RESTORE DATABASE命令完成了全备份的恢复,同时指定了NORECOVERY子句。 3)根据事务日志进行恢复 n利用日志可以将数据库恢复到最新的一致状态或任意的事务点。 n首先恢复事务日志备份之前的数据库备份或增量数据库备份。 n如果有多个日志备份,则按先后顺序进行恢复。 3)根据事务日志进行恢复(2)RESTORE LOG database_nameFROM DISK | TAPE =physical_backu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论