《数据库事务管理...ppt》由会员分享,可在线阅读,更多相关《数据库事务管理...ppt(76页珍藏版)》请在课桌文档上搜索。
1、事务管理,18:53,事务管理,问题的引入 事务 并发控制 数据库恢复,18:53,问题的引入,多用户同时操作数据库系统在执行用户的请求时出现故障,例如:帐户A转帐给帐户B10000元。,UPDATE YHZH SET 余额=余额-10000 WHERE 帐号=AUPDATE YHZH SET 余额=余额+10000 WHERE 帐号=B,18:53,事务的基本概念,事务(Transaction)用户定义的一个对数据库读写操作序列一个不可分割的工作单位在关系数据库中,事务可以是一条、一组SQL语句,或整个程序。事务和程序的区别?程序包含多个事务,18:53,事务的性质,原子性(Atomicit
2、y)事务中的操作要么都做,要么都不做(All or None)一致性(Consistency)事务执行的结果必须使数据库从一个一致性状态变到另一个一致性状态与原子性密切相关隔离性(Isolation)并发执行的各事务不能相互干扰持续性/永久性(Durability)事务一旦提交,它对数据库的更新不再受后继操作或故障的影响 DBMS中事务处理必须保证其ACID特性,这样才能保证数据库中数据的安全和正确。,18:53,银行转帐:从帐号A中取出一万元,存入帐号B。定义一个事务,该事务包括两个操作这两个操作要么全做,要么全不做全做或者全不做,数据库都处于一致性状态。如果只做一个操作,数据库就处于不一致
3、性状态。,事务的性质,18:53,T1的修改被T2覆盖了!,事务的性质,18:53,事务的基本概念,事务的开始和结束可以由用户显式控制。SQL定义事务的语句Begin transaction(事务开始)Commit transaction(事务提交,正常结束,将更新结果写入磁盘)Rollback transaction(事务回滚,撤销事务中所有已完成的更新)Save transaction(保存点,可以只撤消部分事务),18:53,事务的基本概念,显式定义方式 BEGIN TRANSACTION BEGIN TRANSACTION SQL 语句1 SQL 语句1 SQL 语句2 SQL 语句2
4、。COMMIT ROLLBACK,18:53,COMMIT事务正常结束 提交事务的所有操作(读+更新)事务中所有对数据库的更新永久生效ROLLBACK事务异常终止事务运行的过程中发生了故障,不能继续执行,回滚事务的所有更新操作事务回滚到开始时的状态,事务的基本概念,18:53,事务的基本概念,隐含事务与自动提交 ALTER INSERT CREATE DELETE DROP SELECT UPDATE TRUNCATE TABEL,18:53,例:删除仓库“WH1”,并将职工T表当中所有在“WH1”仓库中职工记录删除。,事务案例,BEGIN TRANSACTION MYDELDELETE FR
5、OM 仓库TWHERE 仓库号=WH1DELETE FROM 职工TWHERE 仓库号=WH1IF ERROR0ROLLBACK TRANSACTION MYDELELSECOMMIT TRANSACTION MYDEL,18:53,恢复机制与并发控制机制的提出事务在运行过程中因某种故障被强行终止,数据库一致性被破坏,需进行恢复。多个事务并行运行时,不同事务的各种操作交叉进行,为保证各事务的执行互不干扰,需进行并发控制。事务是恢复和并发控制的基本单位,事务的基本概念,18:53,干扰问题 解决干扰封锁 封锁不当死锁 封锁与隔离级别,并发控制,18:53,干扰问题,丢失更新问题未提交依赖(读“脏
6、”数据)问题不一致分析问题幻象读问题,18:53,丢失更新问题,例:旅客A来到A售票处,要买一张15日北京到上海的13次直达快速列车的软卧车票,售票员A(下称用户A)在终端A查看剩余票信息;几乎在同时,旅客B来到B售票处,也要买一张15日北京到上海的13次直达快速列车的软卧车票,售票员B(下称用户B)从终端B查到了同样的剩余票信息;旅客A买了一张15日13次7车厢5号下铺的软卧票,用户A更新剩余票信息并将它存入数据库;这时用户B不知道用户A已经将15日13次7车厢5号下铺的软卧票卖出,使旅客B也买了一张15日13次7车厢5号下铺的软卧票,用户B更新剩余票信息并将它存入数据库(重复了用户A已经做
7、过的更新)。,总的效果:15日13次7车厢5号下铺的软卧票卖了两次。其原因是:允许了用户B在过时的信息基础上去更新数据库,而没有迫使他去看最新的信息。,18:53,丢失更新问题,用SQL术语描述丢失更新问题,18:53,未提交依赖问题,未提交依赖问题也称为读“脏”(Dirty Read)数据问题,查询一个已经被其他事务更新、但尚未提交的元组,将会引起未提交依赖问题。,18:53,不一致分析问题,不一致分析问题也称为不可重复读问题,很多应用可能需要校验功能,这时往往需要连续两次或多次读数据进行校验和分析,结果由于其他事务的干扰,使得前后结果不一致,从而产生校验错误(即不一致的分析)。,18:53
8、,幻象读问题,幻象读问题与不一致分析问题有关,当事务A读数据时,事务B在对同一个关系进行插入或删除操作,这时事务A再读同一条件的元组时,会发现神秘地多出了一些元组或丢失了一些元组,把这种现象称作幻象读。,18:53,可串行性,各单个事务如能将数据库从一个正确状态转变为另一个正确状态,则认为该事务是正确的;按任何一个串行顺序依次执行多个事务是正确的。事物交叉过程是正确的,当且仅当其与串行执行过程等价,则事务是可串行化的。,18:53,可串行性,例子:两个事务:初值:A=10,B=10。,T1:SELECT A UPDATE A=A-5 SELECT B UPDATE B=B+5,T2:SELEC
9、T B UPDATE B=B-5,18:53,可串行性,T1:SELECT A UPDATE A=A-5 SELECT B UPDATE B=B+5,T2:SELECT B UPDATE B=B-5,18:53,可串行性,T1:SELECT A UPDATE A=A-5 SELECT B UPDATE B=B+5,T2:SELECT B UPDATE B=B-5,18:53,可串行性,T1:SELECT AUPDATE A=A-5SELECT BUPDATE B=B+5,T2:SELECT BUPDATE B=B-5,18:53,可串行性,T1:SELECT AUPDATE A=A-5SELE
10、CT BUPDATE B=B+5,T2:SELECT BUPDATE B=B-5,不可串行化,18:53,封锁,封锁的基本技术 封锁机制 SQL Server中与封锁有关的命令 封锁粒度 意向锁,18:53,封锁的基本技术,当需要查询或更新数据时,先对数据进行封锁,以避免来自其他事务的干扰。针对不同的干扰问题可以有不同的封锁机制。以丢失更新问题为例,实施封锁的基本思想是:当一个用户对一个表或记录进行更新时,封锁该表或记录,使其他用户不能在同一时刻更新相同的表或记录,迫使其他用户在更新后的基础上(而不是在更新前的基础上)再实施另外的更新操作。,18:53,封锁的基本技术,实施封锁以后的事件进程,
11、18:53,封锁机制,共享封锁 独占封锁 更新封锁,有些封锁在执行完相应操作后就自动释放封锁,有些封锁则保持到事务结束(提交或撤消)时才释放(无论如何,所有的封锁都会在事务结束时自动释放)。,18:53,共享封锁,共享封锁是为读操作设置的一种封锁,所以也称作读封锁,或简称S锁,目的是想读到一组不变的数据,也就是在读数据的过程中,不允许其他用户对该数据进行任何修改操作。这种封锁可以保证最大的并发性,任何数量的用户都可以同时对同样的数据施加这种共享锁。已经实施共享锁的表拒绝来自其他事务的独占封锁和更新封锁。,18:53,独占封锁,独占封锁也叫排他封锁,它是为修改操作设置的一种封锁,也称为写封锁,或
12、简称为X锁,这是最严格的一类封锁。当需要对表实施插入、删除或修改操作时,应该使用独占封锁。已经实施独占封锁的表,拒绝来自其他用户的任何封锁。,18:53,更新封锁,当需要对一个记录或一组记录进行更新时(只是修改,不包括插入和删除)使用更新封锁,该封锁的目的是防止其他用户在同一时刻修改同一记录。已经实施更新封锁的记录,拒绝来自其他用户的任何封锁。,18:53,SQL Server中与封锁有关的命令,SQL Server的封锁操作是在相关语句的“WITH()”子句中完成的,该短语可以在SELECT、INSERT、UPDATE和DELETE等语句中指定表级锁定的方式和范围。,18:53,SQL Se
13、rver中与封锁有关的命令,常用的封锁关键词有:TABLOCK:对表施行共享封锁,在读完数据后立刻释放封锁,此类封锁可以避免读“脏”数据,但不具有可重复读的特性。HOLDLOCK:与TABLOCK一起使用,可将共享锁保留到事务完成,而不是在读完数据后立即释放锁,这样可以保证数据的可重复独特性。,18:53,SQL Server中与封锁有关的命令,NOLOCK:不进行封锁,此关键词仅应用于SELECT语句,这样可能会读取未提交事务的数据,即有可能发生“脏”读。TABLOCKX:对表实施独占封锁。UPDLOCK:对表中的指定元组实施更新封锁;这时其他事务可以对同一表中的其他元组也实施更新封锁,但是
14、不允许对表实施共享封锁和独占封锁。,18:53,SQL Server中与封锁有关的命令,R(日期,车次,座别,座位号,状态)状态初值为:NULLDECLARE 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 日期=d AND 车次=t AND 座别=sCOMMIT TRANSACTIONELSEROLLB
15、ACK TRANSACTION,18:53,封锁粒度,封锁的对象可以是表、也可以是元组等,我们把封锁对象的大小称为封锁粒度(Granularity)。封锁的对象可以是逻辑单元(如表和元组等),也可以是物理单元(如数据页和数据块等)。数据库管理系统一般都具有多粒度锁定功能,允许一个事务锁定不同类型的资源。,18:53,封锁粒度,锁定在较小的粒度(例如行)可以增加并发操作的性能,但系统开销也较大。这是因为如果封锁的粒度小,则意味着需要的锁多,从而需要系统控制更多的锁。锁定在较大的粒度(例如表)会降低操作的并发性,这是因为锁定整个表限制了其他事务对表中任意部分进行访问。封锁粒度大,则不需要太多的封锁
16、,由于需要维护的锁较少,所以系统开销较低。,18:53,意向锁,为了降低封锁的成本,提高并发的性能,数据库管理系统还支持一种意向锁(Intention Lock)。意向锁表示一种封锁意向,当需要在某些底层资源上(如元组)获取封锁时,可以先对高层资源(如表)实施意向锁。,18:53,死锁,产生死锁的原因 避免死锁 发现死锁解决死锁,18:53,产生死锁的原因,右图示意了两个并发事务所发生事件的序列,两个程序都为了等待对方释放数据资源而产生死锁。,18:53,避免死锁,相同顺序法 所有的用户程序约定都按相同的顺序来封锁表 一次封锁法 为了完成一个事务,一次性封锁所需要的全部表,18:53,避免死锁
17、的封锁,18:53,发现死锁,超时法 即一个事务在等待的时间超过了规定的时限后就认为发生了死锁。这种方法非常不可靠,如果设置的等待时限长,则不能及时发现死锁;如果设置的等待时限短,则可能会将没有发生死锁的事务误判为死锁。,18:53,发现死锁,等待图法 即通过有向图判定事务是否是可串行化的,如果是则说明没有发生死锁,否则说明发生了死锁。具体思路是:用节点来表示正在运行的事务,用有向边来表示事务之间的等待关系,如右图所示,如果有向图中发现回路,则说明发生了死锁。,18:53,解决死锁,发现死锁后解决死锁的一般策略是:自动使“年轻”的事务(即完成工作量少的事务)先退回去,然后让“年老”的事务(即完
18、成工作量多的事务)先执行,等“年老”的事务完成并释放封锁后,“年轻”的事务再重新执行。,18:53,隔离级别,在避免干扰的情况下,适当的降低隔离级别,从而提高并发的操作效率。隔离级别越低,并发操作效率越高,但是产生干扰的可能性也越大。隔离级别越高,并发操作效率越低,同时产生干扰的可能性也越小。在设计应用时,可以在所能容忍的干扰程度范围内,尽可能降低隔离级别,提高应用的执行效率。,18:53,隔离级别,未提交读(READ UNCOMMITTED):最低级别,仅可保证不读取物理损坏的数据,隔离级别最低。提交读(READ COMMITTED):SQL Server 默认级别,可以保证不读取“脏”数据
19、可重复读(REPEATABLE READ):可以保证读一致性,避免不一致分析问题。可串行化(SERIALIZABLE):事务隔离的最高级别,事务之间完全隔离。,SQL支持4种隔离级别:,18:53,隔离级别,SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED READ COMMITTED REPEATABLE READ SERIALIZABLE,设置隔离级别的命令,18:53,数据库恢复,数据库恢复概述备份恢复与还原,18:53,数据库恢复概述,故障是不可避免的计算机硬件故障系统软件和应用软件的错误操作员的失误恶意的破坏故障的影响运行事务非正常中断
20、破坏数据库,18:53,数据库管理系统对故障的对策DBMS提供恢复子系统保证故障发生后,能把数据库中的数据从错误状态恢复到某种逻辑一致的状态保证事务ACID恢复技术是衡量系统优劣的重要指标,数据库恢复概述,18:53,故障类型,事务故障系统故障磁盘介质故障,18:53,事务故障,什么是事务故障某个事务在运行过程中由于种种原因未运行至正常终止点就夭折了事务故障的常见原因输入数据有误运算溢出违反了某些完整性限制某些应用程序出错并行事务发生死锁。,18:53,事务故障的恢复,发生事务故障时,夭折的事务可能已把对数据库的部分修改写回磁盘事务故障的恢复:撤消该事务清除该事务对数据库的所有修改,使得这个事
21、务象根本没有启动过一样,18:53,系统故障,什么是系统故障整个系统的正常运行突然被破坏所有正在运行的事务都非正常终止内存中数据库缓冲区的信息全部丢失外部存储设备上的数据未受影响,18:53,系统故障的恢复,清除尚未完成的事务对数据库的所有修改系统重新启动时,恢复程序要强行撤消所有未完成事务将缓冲区中已完成事务提交的结果写入数据库系统重新启动时,恢复程序需要重做所有已提交的事务,18:53,介质故障,硬件故障使存储在外存中的数据部分丢失或全部丢失介质故障比前两类故障的可能性小得多,但破坏性大得多,18:53,介质故障的恢复,装入数据库发生介质故障前某个时刻的数据副本重做自此时始的所有成功事务,
22、将这些事务已提交的结果重新记入数据库,18:53,备份类型,双机热备份双工备份磁盘镜像冗余磁盘阵列数据库备份技术,18:53,日志,对备份的补充,记录所有对数据库的更新操作。,注意:应该将日志和主数据库安排在不同的存储设备上。,18:53,恢复类型,简单恢复 允许将数据库恢复到最新的备份。完全恢复 允许将数据库恢复到故障点状态。,ALTER DATABASE 仓库管理 SET RECOVERY FULL ALTER DATABASE 仓库管理 SET RECOVERY SIMPLE,18:53,备份的类型,全备份增量备份事务日志备份文件和文件组备份,18:53,全备份,完整地备份整个数据库,同
23、时也备份与该数据库相关的事务处理日志。,BACKUP DATABASE database_nameTO DISK|TAPE=physical_backup_device_name,例:将“仓库管理”数据库完全备份到H盘根目录下。,BACKUP DATABASE 仓库管理TO DISK=H:CKGL.BAK,18:53,增量备份,只备份自上次数据库备份后发生更改的数据。,BACKUP DATABASE database_nameTO DISK|TAPE=physical_backup_device_nameWITH DIFFERENTIAL,例:将“仓库管理”数据库增量备份到H盘根目录下。,BA
24、CKUP DATABASE 仓库管理TO DISK=H:CKGL1.BAKWITH DIFFERENTIAL,18:53,注:增量备份一定是在全备份的基础上进行的,在一次全备份后可以连续进行增量备份。增量备份会增加备份管理的难度。,增量备份,18:53,事务日志备份,事务日志备份序列提供了连续的事务信息链,可支持从全备份,增量备份或文件备份进行快速恢复。,BACKUP LOG database_nameTO DISK|TAPE=physical_backup_device_name,例:将“仓库管理”数据库的事务日志备份到H盘根目录下。,BACKUP LOG 仓库管理TO DISK=H:CKG
25、LLOG.BAK,注:简单恢复模型不允许备份事务日志。,18:53,文件和文件组备份,可以备份和恢复数据库中的个别文件。文件备份和恢复操作必须与事务日志备份一起使用。因此,文件备份不适用于简单恢复模型。必须在创建文件备份之后才能创建事务日志备份。,18:53,文件和文件组备份,BACKUP DATABASE database_nameFILE=logic_file_list|FILEGROUP=filegroup_listTO DISK|TAPE=physical_backup_device_name,例:将“仓库管理”数据库中的“仓库管理_DATA”文件备份到H盘根目录下。,BACKUP D
26、ATABASE 仓库管理FILE=仓库管理_DATATO DISK=H:CKGLDATA.BAK,18:53,恢复或还原,恢复整个数据库恢复数据库的部分内容恢复特定的文件或文件组恢复事务,18:53,根据数据库全备份进行恢复,RESTORE DATEBASE database_nameFROMDISK|TAPE=physical_backup_device_nameWITH,NORECOVERY|RECOVERY,REPLACE,注:如果在数据库恢复之后即使用数据库,应该选择RECOVERY;如果在数据库恢复之后还有后续的RESTORE操作,则应改为指定NORECOVERY。,18:53,根据
27、增量备份进行恢复,已经使用RESTORE DATEBASE 命令完成了全备份的恢复,同时指定了NORECOVERY;在进行增量恢复时根据需要指定RECOVERY或NORECOVERY字句;如果有多个增量备份,则一定要按照备份的先后顺序进行恢复。,18:53,根据事务日志进行恢复,在恢复事务日志备份之前需要首先恢复数据库全备份或增量数据库备份;如果有多个日志备份,则按先后顺序进行恢复。,注意:,18:53,根据事务日志进行恢复,RESTORE LOG database_nameFROMDISK|TAPE=physical_backup_device_nameWITH,NORECOVERY|RECOVERY,STOPAT=date_time|,STOPATMARK=mark_nameAFTER datetime|,STOPBEFOREMARK=mark_nameAFTER datetime,18:53,根据文件或文件组进行恢复,RESTORE DATEBASE database_nameFILE=logic_file_list|FILEGROUP=filegroup_listFROMDISK|TAPE=physical_backup_device_name,