第13章 事务和锁定.ppt_第1页
第13章 事务和锁定.ppt_第2页
第13章 事务和锁定.ppt_第3页
第13章 事务和锁定.ppt_第4页
第13章 事务和锁定.ppt_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

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

温馨提示

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

评论

0/150

提交评论