《【教学课件】第13章事务和锁定.ppt》由会员分享,可在线阅读,更多相关《【教学课件】第13章事务和锁定.ppt(18页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、LOGO第第第第1313章章章章 事务和锁定事务和锁定事务和锁定事务和锁定讲师姓名讲师姓名第13章事务和锁定事事务概述概述1事事务还原原2事务锁定事务锁定313.1事务概述事事务务是是用用于于将将多多个个语语句句合合并并为为一一个个整整体体并并使使这这个个整整体体具具有有不不可可分分割割,同同进进同同退退的的特特性性。在在一一个个事事务务内内部部的的语语句句,要要么么一一个个都都不不做做,要要么么全全部部做做完完,这这保保证证了了数数据据在在逻逻辑辑上上的的一一致致性性,使使得得许许多多现现实实中的交易得以顺利进行。中的交易得以顺利进行。13.1.1ACID属性事务是属于某个逻辑单元的一系列操
2、作,这一系列操作具有四个属性,即ACID属性,分别为原子性(Atomicity也即不可分割性),一致性(Consistency),隔离性(Isolation),和耐久性(Durability)。13.1.1ACID属性1.原子性原子性原子性保证了事务的完整性。如前所述,事务是由一系列操作组成的,这些操作要么全部都做完,要么一个也不做。也就是说,只有当其中所有的操作都成功执行后这个事务才算是成功执行,若有一个操作执行失败,则将使得其它所有成功的操作都被取消。这就是事务的原子性。事务的原子性是非常具有其应用价值的,最典型和最普遍的莫过于银行交易,只有当用户所有操作做完确认后整个交易才算完成,否则将
3、取消这笔交易。若不采用事务,则有可能出现这样的情况:用户在ATM上取钱,交易刚将用户账户上的那部分额度减去正准备出款,此时突然停电,系统停止。当重新启动系统时用户会发现尽管自已账户上的金额减少了,但却并没有拿到这部分钱。而如果采用了事务,则可以将“出款”和“减额”这两个操作放在同一个事务中,用户若没取到钱绝不会出现账户上金额减少的问题。13.1.1ACID属性2.一致性一致性一致性的意思是指无论在交易开始还是交易结束,所有数据都是处于同一状态。交易成功则所有数据处于交易结束状态,交易失败则所有数据处于效易开始状态,而不会出现一个数据处于交易开始的状态而另一个数据却处于交易结束状态。3.隔离性隔
4、离性隔离性是指一个事务与其它同时发生的事务是不相互影响的。也就是说当一个事务发生时,看起来好像是只有它一个事务在运行一样。在事务A要用到事务B可能要操作的数据时,事务A只会使用在事务B发生之前或发生之后的数据,而不会使用处于事务B发生后还没有完成时期的数据。13.1.1ACID属性持久性是指事务一但认可,对系统就形成了一个永久的结果,就算系统出现故障了这种结果也不会丢失。在SQLServer中进行事务处理时,将会利用事务日志的机制,系统首在事务开始时做一个标志,只有当事务确认了以后才认为交易结束,这样就可以确保在系统故障时的交易有效性。13.1.2事务的几种模式模式模式1:自动提交模式:自动提
5、交模式自动提交是SQL中默认的事务提交模式。它是将每一条语句作为一个事务,当每个语句完成后提交事务。比如,在默认环境下,下面的语句自成一个事务。在修改数据后,由这条语句形成的事务自动提交。自动认可模式是很有用的模式,用户不必关心明确的开始或结束。自动提交模式将默认执行,直到遇到显式的事务开始语句或设定了隐式模式后遇到隐式启动事务的语句为止。13.1.2事务的几种模式显式是指采用专门的语句开始启动事务的模式。显式常用于应用程序存储过程或触发器这些序列化的指令中。显式事务用以下语句进行指定和控制:BEGINTRANSACTION表示事务的开始,同时也表示显式事务开始。COMMITTRANSACTI
6、ON或COMMITWORK显示事务的结束,如果在事务开始后没有出现错误,可以用该语句结束事务,并提交,这样,该次事务中的所有数据修改在数据库中都将永久有效。事务占用的资源也将被释放。ROLLBACKTRANSACTION或ROLLBACKWORK当显示事务开始后遇到错误,则可以用该语句来处理遇到错误的事务。该事务修改的所有数据都返回到事务开始时的状态。事务占用的资源将被释放。开始一个事务的语法如下:13.1.2事务的几种模式模式模式3:隐式:隐式隐式是指在这种模式下,一些语句它即不是自动提交模式那样每条语隐式是指在这种模式下,一些语句它即不是自动提交模式那样每条语句作为一个事务提交一次,也不是
7、显性地指定句作为一个事务提交一次,也不是显性地指定BEGIN TRANSACTION来开始事务。它是一些特定的语句,这些语句一旦使来开始事务。它是一些特定的语句,这些语句一旦使用,则事务开始,直到显示地结束或用户断线为止。用,则事务开始,直到显示地结束或用户断线为止。启动隐式事务模式的语法为:启动隐式事务模式的语法为:SET IMPLICIT_TRANSACTIONS ON|OFF 设置为设置为 ON 时,时,SET IMPLICIT_TRANSACTIONS 将启动隐性事务模将启动隐性事务模式。设置为式。设置为 OFF 时,则返回到自动提交事务模式。时,则返回到自动提交事务模式。下面为使用隐
8、式事务的例子:下面为使用隐式事务的例子:13.1.3事务的相关信息1.TRANCOUNTTRANCOUNT代表了当前连接的活动事务数量。当开始一个事务时,它自动加1,回滚整个事务将使此值减1,但如果回滚至保存点则此值不变。2事务中不允许的语句在一个事务中不允许有下面的语句存在,不论是显式事务还是隐式事务。RESTORELOGDUMPTRANSACTIONUPDATESTATISTICSDROPDATABASERESTOREDATABASEDISKINITRECONFIGUREALTERDATABASELOADDATABASEBACKUPLOGLOADTRANSACTIONCREATEDATAB
9、ASE13.2事务还原SQLServer的事务恢复有两种方式,一是系统自动还原,另一种是利用T-SQL语句还原。下面分别介绍这两种恢复方法。1.系统自动恢复系统自动恢复系统自动还原发生在两种时间(1).系统执行T-SQL语句出错时。此时系统将会自动还原出错的那条语句。如果设置XACT_ABORT为ON的话,则在一条语句出错后将放弃所有正在执行和将执行的语句,回滚事务。如为OFF,则自动还原出错的语句而不中断正在进行的事务。(2).在SQLServer服务器重新启动时,也将会自动回复。在启动时系统将会自动检查数据库的完整性,恢复提交的交易并且回滚未提交的交易系统错误信息以恢复系统。13.2事务还
10、原2.程序恢复程序恢复程序恢复是通过ROLLBACK来进行的。在一个T-SQL程序中,一些可预见或不可预见的情况常被写为分支,如果出现可预见的但不希望发生的情况或不可预见的情况,则需要让事务回滚,以回到事务的初始状态。这时需要用到ROLLBACK语句,当程序执行到ROLLBACK语句时,将放弃后续语句的执行。回滚的语法如下:ROLLBACKTRANSACTIONtransaction_name|tran_name_variable|savepoint_name|savepoint_variable其中transaction_name由事务开始时,BEGINTRANSACTION所指定的事务名字
11、。在嵌套的事务中,这个名字必须跟最远那个BEGINTRANSACTION的名字相同,其长度必须小于32个字符。如果是用后面的变量tran_name_variable,则需用char,varchar,nchar,nvchar来定义。如果ROLLBACKTRANSACTION后面跟事务名字,则将回滚至由这个名字指定的事务起始点。可以省略。savepoint_name由SAVETRANSACTION指定的保存点名称。如果ROLLBACKTRANSACTION后面跟保存点,则将回滚至保存点处。可以省略。13.3事务锁定并发事务常常遇到对相同资源的访问。比如同时有两个事务对数据库Northwind中的E
12、mployees资料表的读取或修改。可以预见,如果不对这些并发事务的访问加以控制,将可能带来大量的错误。比如,有两个事务,其中一个对数据库Northwind中的表Employees读取其Phone列,以得到最新的电话,而另一个事务也在对数据库Northwind中的表Employees修改Phone列,由第6章可知,修改操作是先删除再插入的操作,假设更新数据的事务刚删除列,正插入到一半,也即刚刚写入一半数据时(如本来电话号码是054-422984332,却只写到054-422时)读取事务将这个数据读去,则显然读到的数据是错误数据。又如,一个更新的数据的事务正准备对数据库Northwind中的表S
13、hippers的CompanyName列进行更改,刚找到了这个数据项所在的叶子结点(物理位置),这时一个删除数据库Northwind中的表Shippers的事务由于得到处理机开始执行,在删除事务完成后更新数据的事务继续执行,更改数据,但此时所处的表已经不存在,更改数据的地址已经无效,如果更改的区域还没有被系统分配给其它表使用,则改在空白区域虽然无效但还不至于造成危害,但如果这个区域已被系统分配给其它表使用,则将造成其它表的数据失效。13.3事务锁定共享锁(共享锁(Shared)共享锁用于多个事务的读取,比如用SELECT读取Northwind数据库中表Customers的一行时,就先在这一行上
14、加上共享锁后才能读取,如果没加上锁就不能读取。加上了共享锁就使得其它要更改数据的锁无法加上,其它对数据有写入的事务就无法使用这一行,保证了读取的有效性。同时,另一个也是读取这一行的事务可以却给这一行加上共享锁以读取数据,这是因为并行事务中如果有一个写数据,将破坏数据的有效性,而并行读则不影响数据的有效性。这样就使得所有持有对某个对象共享锁的事务得以与其它同样持有对这个对象共享锁的事务可以同时上锁,然后同时访问数据。排它锁排它锁(Exclusive)排它锁顾名思义是指对一个资源一旦上锁,则其它锁不可以再锁定该资源。排它锁常用于对资源有更改的事务。这样可以防止破坏数据的有效性。13.3事务锁定更新
15、锁更新锁(Update)更新锁是指先读取数据再写入数据的事务使用的锁。先读取数据再写入数据这种操作本来应当先采用共享锁以读取数据,再采用排它锁以更改数据,但这常常容易造成死锁。考虑下面这种情况:有两个事务A和B都是对数据库的一行采取先读取再更改的操作,两个进程在最开始时由于是读操作,采用共享锁锁定。而后转为写,假定它们同时转为写操作,则事务A在由共享锁转到排它锁这段时间里,发现事务A已经用共享锁锁定了资源,于是暂时放弃将共享锁转变为排它锁,继续等待,而此时事务B也跟A在做同样的转变工作,试图将共享锁转变为排它锁,最后的结果是,两个事务一直想将共享锁转变为排它锁,却但一直都因为对方的共享锁已经锁
16、定资源而无法进行,这就造成了死锁。解决的办法是采用更新锁。更新锁在共享锁阶断就只允许有一个事务对资源进行访问,所以当这个事务在由共享锁转变为更新锁时不可能存在上述的还有另一个事务用共享锁锁定资源的情况,从而避免了死锁。13.3事务锁定意向锁意向锁(Intent)意向锁表示将要在某个资源上放置某种锁,以用于建立锁定层次。意向锁分为三类:意向共享锁、意向排它锁、意向排它共享锁。意向锁有下面几种类型:(1).意向共享锁(2).意向排它锁(3).与意向排它共享锁构架锁构架锁(Schema)用于对表的结构操作时,采用构架锁。使用这种锁有两种场合,一是在执行资料定义语言(DDL)时,另一种是在锁定用于编译查询时。大容量更新锁大容量更新锁(Bulk Update)大容量更新锁是指在大容量复制,且指定了TABLOCK提示或者使用sp_tableoption设置了tablelockonbulk表选项时使用的锁。这种锁可以使得在大容量复制时其它操作不对正在复制的数据进行操作。LOGO