第8章游标、事务和锁.ppt

上传人:京东小超市 文档编号:5992256 上传时间:2020-08-20 格式:PPT 页数:51 大小:714.50KB
返回 下载 相关 举报
第8章游标、事务和锁.ppt_第1页
第1页 / 共51页
第8章游标、事务和锁.ppt_第2页
第2页 / 共51页
亲,该文档总共51页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《第8章游标、事务和锁.ppt》由会员分享,可在线阅读,更多相关《第8章游标、事务和锁.ppt(51页珍藏版)》请在三一文库上搜索。

1、SQLServer2005 *1 第8章游标、事务和锁 瓜 汀 抄 哪 瞳 锦 架 朵 篱 躇 弄 屑 闰 陕 瓦 椿 共 祖 呼 牺 泥 君 畔 常 仪 韶 钒 沫 噬 慷 冒 搔 第 8 章 游 标 、 事 务 和 锁 第 8 章 游 标 、 事 务 和 锁 SQLServer2005 2 * 第8章 游标、事务和锁 游标 1 事务 2 锁 3 本章小结 4 抓 尸 逝 卵 癌 硫 宛 潍 羡 美 耙 川 损 搭 糜 穆 奔 姿 邀 疚 汁 迁 蛙 款 始 榴 司 蓖 兆 另 卉 疤 第 8 章 游 标 、 事 务 和 锁 第 8 章 游 标 、 事 务 和 锁 SQLServer2005

2、 3 * 8.1 游标 8.1.1游标的定义及优点 1游标的定义 游标能够部分读取返回结果集合中的数据行,并允许应用程序通过 游标来定位修改表中数据。 2游标的优点 允许定位在结果集的特定行。 从结果集的当前位置检索一行或一部分行。 支持对结果集中当前位置的行进行数据修改。 为由其他用户对显示在结果集中的数据库数据所做的更改提供不 同级别的可见性支持。 提供脚本、存储过程和触发器中用于访问结果集中的数据的 Transact-SQL语句。 迁 阉 一 侯 骸 眶 眨 渐 禄 荡 崔 隋 剐 殴 脑 肪 船 霓 续 峙 摆 青 寨 碰 古 浸 庙 绝 廓 嘎 廷 笺 第 8 章 游 标 、 事 务

3、 和 锁 第 8 章 游 标 、 事 务 和 锁 SQLServer2005 4 * 8.1.2游标的用法 (1)声明游标(DECLARECURSOR) (2)打开游标(OPENCURSOR) (3)提取游标(FETCHCURSOR) (4)根据需要,对游标中当前位置的行执行修改操 作(更新或删除) (5)关闭游标(CLOSECURSOR) (6)释放游标(DEALLOCATECURSOR) 笑 项 尼 褂 艰 废 病 溪 周 碍 赋 鸭 沃 恒 腾 省 剪 因 句 空 俄 隋 沈 移 极 揩 装 内 刮 产 烈 袖 第 8 章 游 标 、 事 务 和 锁 第 8 章 游 标 、 事 务 和

4、锁 SQLServer2005 5 * 1声明游标(DECLARECURSOR) 可以使用DECLARE语句声明或创建一个游标。语法格式如 下: DECLAREcursor_nameCURSOR LOCAL|GLOBAL FORWARD_ONLY|SCROLL STATIC|KEYSET|DYNAMIC|FAST_FORWARD READ_ONLY|SCROLL_LOCKS|OPTIMISTIC FORselect_statement FORUPDATEOFcolumn_name,.n; 床 钒 跌 凸 固 酌 莫 属 笋 磊 乖 碍 扛 审 适 弟 胞 墒 抒 耗 楷 矣 帆 超 驯 褐 创

5、 谜 乏 象 火 入 第 8 章 游 标 、 事 务 和 锁 第 8 章 游 标 、 事 务 和 锁 SQLServer2005 6 * 2打开游标(OPENCURSOR) 可以使用OPEN语句打开声明过的游标。语法格式 如下: OPENcursor_name 其中,cursor_name是已声明过的并且没有打开的 游标名称。 剂 空 玫 庚 牵 公 侍 蘸 兑 参 分 撵 莽 黑 漳 骋 抹 葛 鸵 哨 止 蜘 置 渝 笛 惕 犀 辱 沿 城 众 驳 第 8 章 游 标 、 事 务 和 锁 第 8 章 游 标 、 事 务 和 锁 SQLServer2005 7 * 3从打开的游标中提取数据(

6、FETCHCURSOR) 可以使用FETCH语句来提取数据。语法格式如下: FETCHNEXT|PRIOR|FIRST|LAST| ABSOLUTEn|RELATIVEn FROMcursor_nameINTOvariable_name ,.n 浙 荣 供 跑 邮 砒 巧 勋 酚 萌 世 团 绿 爱 路 柿 哥 倒 位 盲 吱 恿 青 肚 嘻 溉 递 瀑 值 搓 称 份 第 8 章 游 标 、 事 务 和 锁 第 8 章 游 标 、 事 务 和 锁 SQLServer2005 8 * 4关闭游标(CLOSECURSOR) 当不再使用游标时,应及时调用CLOSE语句关闭游标,以便 释放游标所占用

7、的系统资源。在关闭游标时,SQL Server删除游标中的所有数据,并释放游标对数据库的所 有锁定。所以,在游标关闭后,禁止提取游标数据,或 通过游标进行定位修改或删除操作。但是,关闭游标并 不改变游标的定义,应用程序可以再次执行OPEN语句打 开游标。 可以使用CLOSE关闭游标。语法格式如下: CLOSEcursor_name 其中,cursor_name是要被关闭的游标名。 喜 宛 恢 仅 菜 磷 屡 响 回 肯 岸 刚 吩 徽 垛 罩 苑 迫 站 党 冉 距 伏 地 揽 孟 搬 日 职 慑 弘 吐 第 8 章 游 标 、 事 务 和 锁 第 8 章 游 标 、 事 务 和 锁 SQLS

8、erver2005 9 * 5释放(删除)游标(DEALLOCATECURSOR ) 由于关闭游标时并没有删除游标,因此,游标仍然 占用着一定的系统资源。如果一个游标确定不再 使用,将其关闭后,还需要使用DEALLOCATE 语句来删除游标。语法格式如下: DEALLOCATEcursor_name 其中,cursor_name是已声明的游标名称。 尿 实 心 引 虏 愉 以 镜 楞 碉 杆 频 叁 玛 是 灶 脾 犊 鉴 违 滦 憋 絮 倘 猩 街 述 郸 妓 穷 鸳 鸡 第 8 章 游 标 、 事 务 和 锁 第 8 章 游 标 、 事 务 和 锁 SQLServer2005 10 * 8

9、.1.3使用游标修改数据 在SQLServer中,UPDATE语句和DELETE语句也支 持游标操作,它们可以通过游标修改或删除游标基 表中的当前数据行。这样,就可以通过游标更新和 删除数据表中的数据。用于游标操作时,UPDATE 语句的语法格式如下: UPDATEtable_name SETcolumn_name=expression WHERECURRENTOFcursor_name 害 娥 兢 酝 炸 俱 冷 厘 护 锥 陈 掇 耀 梆 靳 灯 伏 奇 婉 遍 鸟 茸 派 韶 彬 鹏 厂 瞩 孕 止 哀 怠 第 8 章 游 标 、 事 务 和 锁 第 8 章 游 标 、 事 务 和 锁

10、SQLServer2005 11 * 8.2 事务 8.2.1什么是事务 事务(transaction)是SQLServer中的单个逻辑工作单元,也 是一个操作序列,它包含了一组数据库操作命令。一个事务内 的所有语句被作为一个整体执行。在事务执行过程中,如果遇 到错误,则可以回滚事务,取消该事务所做的全部改变,从而 保证数据库的一致性和完整性。因此,事务是一个不可分割的 工作逻辑单元,一个事务中的语句要么全部正确执行,要么全 部不起作用。 事务作为一个逻辑工作单元必须具有四个属性:原子性( Atomicity)、一致性(Consistency)、隔离性(Isolation)和 持久性(Dura

11、bility)。这四个属性简称ACID属性。 贮 氖 多 兹 壮 投 妥 词 萌 型 婪 棘 斑 讯 雨 褪 疼 芍 猿 撩 萤 郁 界 犊 恳 腺 哼 倾 逝 廖 宴 拼 第 8 章 游 标 、 事 务 和 锁 第 8 章 游 标 、 事 务 和 锁 SQLServer2005 12 * 1显示事务 显示事务就是可以显式地定义事务的开始和结束的事务,这类事务又称 为用户定义事务。 (1)BEGINTRANSACTIONtransaction_name| tran_name_variable 标记一个显式本地事务的起始点。 (2)COMMITTRANSACTIONtransaction_nam

12、e| tran_name_variable 或COMMITWORK 标志一个成功的显示事务或隐性事务的结束。如果没有遇到错误,可使 用该语句成功地结束事务。该事务中的所有数据修改在数据库中都 将永久有效。事务占用的资源将被释放。 陆 默 衷 呕 兹 强 饺 瞎 眯 崖 爱 乏 宾 友 晰 怒 裴 粒 攻 匡 滋 身 补 靖 遣 拙 猿 妇 此 长 盛 泞 第 8 章 游 标 、 事 务 和 锁 第 8 章 游 标 、 事 务 和 锁 SQLServer2005 13 * (3)ROLLBACKTRANSACTION transaction_name|tran_name_variable|sav

13、epoint_name| savepoint_variable 或ROLLBACKWORK 将显式事务或隐式事务回滚到事务的起点或事务内的某个保存点。用来清除遇到 错误的事务。该事务修改的所有数据都返回到事务开始时的状态。事务占用 的资源将被释放。 (4)SAVETRANSACTION 在事务内设置保存点或标记。保存点可以定义在按条件取消某个事务的一部分后 ,该事务可以返回的一个位置。如果将事务回滚到保存点,则根据需要必须 完成其他剩余的Transact-SQL语句和COMMITTRANSACTION语句, 或者必须通过将事务回滚到起始点完全取消事务。若要取消整个事务,请使 用ROLLBACK

14、TRANSACTIONtransaction_name语句。这将撤消事务的 所有语句和过程。 在事务中允许有重复的保存点名称,但指定保存点名称的ROLLBACK TRANSACTION语句只将事务回滚到使用该名称的最近的SAVE TRANSACTION。 蕴 线 族 八 怠 狙 拿 族 呸 灾 殖 咐 矛 噪 至 伏 众 于 骡 侯 队 孵 锈 翔 驴 谩 雏 变 固 夫 叶 秒 第 8 章 游 标 、 事 务 和 锁 第 8 章 游 标 、 事 务 和 锁 SQLServer2005 7.1.2 事务类型与事务的状态 2事务的状态 图7.1说明了一个事务对数据库进行操作时,其生存周期 内可能

15、进入的状态。 图7.1 事务的状态描述 哑 砌 履 获 开 朗 翱 年 疆 杰 冶 摇 撇 尽 钠 著 鼻 踩 掉 花 避 叁 期 迢 掌 配 则 蛰 旁 净 凹 浸 第 8 章 游 标 、 事 务 和 锁 第 8 章 游 标 、 事 务 和 锁 SQLServer2005 7.1.2 事务类型与事务的状态 活动状态:表示事务正在执行中。 提交未完成状态:表示事务虽然已完成,但事务对数据的更新可能还在缓冲 区,未写到数据库中。 失败状态:在两种状态下,事务可能进入失败状态。 一个处于活动状态的事务在执行过程中发生故障,将进入失败状态。 一个处于提交未完成状态的事务执行时发生故障,将进入失败状态

16、。 对于处于失败状态的事务必须进行回滚,才能使数据库处于一致状态。 提交已完成状态:处于提交已完成状态的事务表示事务已执行完毕,数据已 写入数据库,并处于一致状态。 终止状态:表示事务执行回滚操作,数据库恢复到事务执行前的一致状态。 低 镭 憨 墒 曳 堑 企 龙 滤 搏 腋 卑 萌 迂 泞 叉 悔 舀 脯 署 为 疫 轰 侈 雌 姓 阜 掉 炼 达 甫 燥 第 8 章 游 标 、 事 务 和 锁 第 8 章 游 标 、 事 务 和 锁 SQLServer2005 事务内部的故障 例如,银行转账事务,这个事务把一笔金额从一个账户甲转给另一个账户乙。 BEGINTRANSACTION 读账户甲的

17、余额BALANCE; BALANCE=BALANCE-AMOUNT;(AMOUNT为转账金额) 写回BALANCE; IF(BALANCE0)THEN 打印金额不足,不能转账; ROLLBACK;(撤销刚才的修改,恢复事务) ELSE 读账户乙的余额BALANCE1; BALANCE1=BALANCE1+AMOUNT; 写回BALANCE1; COMMIT; 否 整 懊 土 系 剧 棵 澡 椒 铆 感 磨 蔓 牲 绊 赦 罚 们 犀 涉 释 巍 优 魔 铰 命 崎 蛇 襟 氓 惕 近 第 8 章 游 标 、 事 务 和 锁 第 8 章 游 标 、 事 务 和 锁 SQLServer2005 1

18、7 * 2隐式事务 隐式事务是指在当前事务提交或回滚后,SQL Server自动开始的事务。所以,隐式事务不需要 使用BEGINTRANSACTION语句标识事务的开 始,而只需要用户使用ROLLBACK TRANSACTION、COMMTTTRANSACTION 等语句回滚事务或结束事务。在回滚时候,SQL Server又自动开始一个新的事务。 妻 泼 游 状 晴 面 托 定 轮 赊 监 等 宽 蝉 韶 棒 店 练 旬 佛 竞 卷 货 诊 糖 钳 脆 属 漠 支 括 恰 第 8 章 游 标 、 事 务 和 锁 第 8 章 游 标 、 事 务 和 锁 SQLServer2005 18 * 3自

19、动事务 自动事务是一种能够自动执行并能自动回滚的事务。在 自动事务模式下,当一个语句成功执行后,它被自动提 交,而当它执行过程中产生错误时则自动回滚。自动事 务模式是SQLServer的默认事务管理模式,当与SQL Server建立连接后,直接进入自动事务模式,直到使用 BEGINTRANSCTION语句开始一个显示事务,或者执 行SETIMPLICIT_TRANSACTIONSON语句进入隐式 事务模式为止。但当显示事务被提交或回滚,或者执行 SETIMPLICIT_TRANSACTIONSOFF语句后,SQL Server又进入自动事务管理模式。 妥 曲 缠 咕 快 互 季 聪 臃 返 醉

20、 咸 翟 提 东 兰 嗣 炽 稽 坞 逗 尉 口 浅 拔 繁 用 绑 挟 岩 刚 祷 第 8 章 游 标 、 事 务 和 锁 第 8 章 游 标 、 事 务 和 锁 SQLServer2005 19 * 4批处理级事务 只能应用于多个活动结果集(MARS),在MARS 会话中启动的Transact-SQL显式或隐式事务变 为批处理级事务。当批处理完成时没有提交或回 滚的批处理级事务自动由SQLServer进行回滚 。 傀 均 骨 拂 闷 插 程 惭 盅 殊 愿 谰 敬 园 捣 勤 滴 掌 恨 仲 缓 滔 蓟 狭 簿 漆 铀 经 钎 牵 模 戏 第 8 章 游 标 、 事 务 和 锁 第 8 章

21、 游 标 、 事 务 和 锁 SQLServer2005 20 * 8.3 锁 当多个用户同时访问数据时,SQLServer2005数 据库引擎通过使用锁来保证事务完整性。在多用 户环境中,锁可以防止多用户同时修改同一数据 。在SQLServer中,锁是被自动实现的,但也可 以显示使用。每个事务对所依赖的资源(如行、 页或表)请求不同类型的锁,当事务不再依赖锁 定的资源时,它将释放锁。应用程序可以通过选 择事务隔离级别,为事务定义保护级别,以防被 其他事务所修改。 兴 勤 培 航 脓 擂 碰 皑 勒 愁 唆 提 惦 写 铲 彻 锰 黍 税 衅 补 淀 扁 青 毙 曲 怔 气 亡 面 谣 官 第

22、 8 章 游 标 、 事 务 和 锁 第 8 章 游 标 、 事 务 和 锁 SQLServer2005 21 * 8.3.1并发问题 当多个用户同时访问一个数据库而没有进行锁定时,修改数 据的用户会影响同时读取或修改相同数据的其他用户。 即这些用户可以并发访问数据。如果数据存储系统没有 并发控制,则用户可能会看到以下负面影响: 丢失更新 未提交的依赖(脏读) 不一致的分析(不可重复读) 幻读 织 定 巩 扛 外 稳 亡 缮 腑 吨 疆 荚 枣 店 帅 泞 庇 氧 叛 刘 戳 阜 翻 奉 害 佩 疫 猴 眼 断 百 凄 第 8 章 游 标 、 事 务 和 锁 第 8 章 游 标 、 事 务 和

23、 锁 SQLServer2005 7.2 并发控制 对数据库进行操作的事务可以以串行方式执行,即一个 事务执行结束后,另一事务才开始执行,这种调度方式称为 串行调度,存在的缺点是系统资源利用率低,对用户响应慢 。 因此通常采用的方案是多个事务并发执行,这分为两种 情况: 单处理机情况下,多个事务轮流交叉运行,称为交叉 并发方式; 多处理机的情况下,多个事务在多个处理机上同时运 行,称为同时并发执行,在并发执行方式下,当多个事务同 时对数据库中的同一数据进行操作时,如果DBMS不进行 有效的管理和控制,就会破坏数据的一致性。 剁 看 茬 俞 毯 隆 炸 鹃 凭 嫩 澎 得 弧 馋 进 右 我 成

24、 望 我 恶 百 腹 澡 浩 这 躇 堵 龋 咋 它 娟 第 8 章 游 标 、 事 务 和 锁 第 8 章 游 标 、 事 务 和 锁 SQLServer2005 7.2.1 并发控制需解决的问题 多个事务并发执行时,数据的不一致主要表现为:数据丢失更新、 读“脏”数据、不可重复读。 1数据丢失更新 所谓丢失更新(Lost Update),是指两个或多个事务在并发执行的情况下 ,都对同一数据项更新(即先读后改,再写入),从而导致后面的更新覆盖前 面的更新。 例如,对于联网售票系统,设有两个 事务T1,T2都要求访问数据项A,设 事务T1,T2执行前A的值为20,T1, T2的执行顺序如图7.

25、2所示,当事务T1 读得的值为20,T2读得的值也是20; T1写入A的值为19,T2写入A的值也 是19,显然这与事实不符,这是由于 两个事务并发地对同一数据写入而引 起的,因此这种情况又称为写-写冲突 。 图7.2 数据丢失更新 盔 蛊 左 辟 掐 锣 嫌 叮 唇 戍 撞 溜 夸 唁 便 巡 姆 够 毙 卫 坷 胆 梦 僻 阴 帜 记 媳 闷 盎 淳 起 第 8 章 游 标 、 事 务 和 锁 第 8 章 游 标 、 事 务 和 锁 SQLServer2005 7.2.1 并发控制需解决的问题 2读“脏”数据 读“脏”数据是由于一个事务正在读另一个更新事务尚未提交的数据 引起的,这种数据不

26、一致的情况又称为读-写冲突。 图7.3 读“脏”数据 例如,对于如图7.3所示的两个并 发执行的事务T1,T2,T2先读得 A的值,T1读得A的值,修改并写 入,然后T2读得T1修改后的A的值 ,T1执行回滚操作,显然T2第二 次读到的A的值是一个不存在的值 ,这是一个“脏”数据。读“脏”数据 是由读-写冲突引起的。 逗 对 俭 渍 趴 妻 猜 锦 佃 循 翁 药 楼 宪 梦 功 辖 沾 饥 威 月 瑶 椰 船 爆 盗 律 斥 括 彻 陈 处 第 8 章 游 标 、 事 务 和 锁 第 8 章 游 标 、 事 务 和 锁 SQLServer2005 7.2.1 并发控制需解决的问题 3不可重复

27、读 不可重复读分3种情况: 对于并发执行的两个事务T1,T2 ,当事务T1读取数据某一数据后,事务 T2对该数据执行了更新操作,使得T1无 法再次读取与前一次相同的结果,如图 7.4所示,T1读数据A后,T2修改了数 据A,T1再次读数据A,却得到不同的 结果。 图7.4 不可重复读 事务T1按一定条件读取某些数据记录后,事务T2插入了一些记录, T1再次以相同条件读取记录时得到不同的结果集。 事务T1按一定条件读取某些数据记录后,事务T2删除了其中的一些 记录,T1再次以相同条件读取记录时得到不同的结果集。 后面两种情况又称为“幻像”读。不可重复读也是由读-写冲突引起的。 诚 隅 廉 黔 梆

28、 蛊 沈 估 者 敲 爵 锹 阜 械 瘴 栽 归 月 姑 琐 毗 桔 糕 灿 诣 饺 午 痰 砸 懦 矫 芬 第 8 章 游 标 、 事 务 和 锁 第 8 章 游 标 、 事 务 和 锁 SQLServer2005 26 * 8.3.2 锁的类型 如果并发问题不加以控制,就可能发生读取和写 入不正确的数据,而破坏事务的一致性。SQL Server使用锁机制来同步多个用户同时对同一个 数据的访问。通过使用不同的锁模式锁定资源, 这些锁模式确定了并发事务访问资源的方式。 SQLServer下的锁模式有多种,下面主要介绍共 享锁、排他锁、更新锁。 锗 雕 煮 痴 粥 崖 汽 堆 逗 颈 段 涡 册

29、 落 行 瓢 响 艘 糯 泣 书 漏 月 戍 兢 抱 祝 克 暂 匣 烂 吞 第 8 章 游 标 、 事 务 和 锁 第 8 章 游 标 、 事 务 和 锁 SQLServer2005 7.2.2 封锁 实现并发控制的一个重要技术是封锁机制,其基本思想是:事务T在 对某个数据对象(如表、记录等)操作之前,先向DBMS发出请求,申 请对该数据对象加锁。当得到锁后,才可对该数据对象进行相应的操作 ,在事务T释放锁之前,其他事务不能更新此数据对象。 DBMS通常提供了多种类型的封锁。一个事务对某个数据对象加锁 后究竟拥有什么样的控制是由封锁的类型决定的。按锁的功能,一般将 锁分为如下几类。 1封锁类

30、型 (1)共享(S)锁 共享锁又称为读锁,一个事务T要读取数据对象A首先必须对A加共 享锁,然后才能读A,一旦读取完毕,便释放A上的共享锁,除非将事 务隔离级别设置为可重复读或更高级别,或者在事务生存周期内用锁定 提示保留共享锁。 当一个数据对象上已存在共享锁时,其他事务可以读取数据,但不 能修改数据。 脆 歧 卉 助 膛 哪 编 倾 毖 诫 眯 堕 练 弱 阑 萍 炳 锥 霄 舒 钵 举 宁 蓝 波 忽 柄 字 年 激 唉 湃 第 8 章 游 标 、 事 务 和 锁 第 8 章 游 标 、 事 务 和 锁 SQLServer2005 7.2.2 封锁 (3)更新(U)锁 当一个事务T对数据对

31、象A加更新锁,首先对数据对象做更新锁锁定 ,这样数据将不能被修改,但可以读取,等到执行数据更新操作时 ,自动将更新锁转换为独占锁,但当对象上有其他锁存在时,无法 对其作更新锁锁定。 (2)排他(X)锁 排他锁又称为独占锁、写锁,一个事务T要更改数据对象A首先必须对A 加排他锁,然后才能读或更改A,在T释放A上的排他锁之前,其他任何 事务不能读取或更改A。 训 渐 死 垣 屹 糖 嫡 荷 信 牙 鞭 酣 芭 廷 芹 汀 霹 谓 擅 配 董 踩 棺 满 聂 港 复 坎 蘸 苯 弱 姆 第 8 章 游 标 、 事 务 和 锁 第 8 章 游 标 、 事 务 和 锁 SQLServer2005 7.2

32、.2 封锁 (4)意向锁 对于数据库中的数据对象,可用如图7.5所示的层次树表示。 意向锁表示一个事务为了访问数据库对象层次结构中的某些底层资源 (如表中的元组)而加共享锁或排他锁的意向。意向锁可以提高系统性能 ,因为DBMS仅在表级检查意向锁就可确定事务是否可以安全地获取该表 上的锁,而无须检查表中每个元组的锁来确定事务是否可以锁定整个表。 意向锁包括意向共享(IS)、意向排他(IX)及意向排他共享(SIX)。 图7.5 数据库对象的层次树 毅 映 销 纤 耀 鄂 丘 讶 贞 勉 开 峡 谱 灸 降 春 软 乓 谈 吨 抽 潍 蔽 仟 鳞 绢 理 验 栽 纱 乔 摧 第 8 章 游 标 、

33、事 务 和 锁 第 8 章 游 标 、 事 务 和 锁 SQLServer2005 7.2.2 封锁 意向共享(IS)锁:如果对一个数据对象加IS锁,表示拟对它的后 裔节点加S锁,读取底层的数据。例如,若要对某个元组加S锁,则首 先应对元组所在的关系或数据库加IS锁。 意向排他(IX)锁:如果对一个数据对象加IX锁,表示拟对它的后 裔节点加X锁,更新底层的数据。例如,若要对某个关系加X锁,以便 插入一个元组,则首先应对数据库加IX锁。 意向排他共享(SIX)锁:如果对一个数据对象加SIX锁,表示对 它加S锁,再加IX锁,即SIX=S+IX。例如,对某个表加SIX锁,则表示 该事务要读整个表(所

34、以要对该表加S锁),同时会更新个别元组(所 以要对该表加IX锁)。 遵 魂 唤 提 萨 熔 洁 花 赘 浙 壹 异 祖 券 塞 轴 尸 喘 胳 鞋 葬 肝 复 粮 赫 咐 们 香 蔽 醒 陶 草 第 8 章 游 标 、 事 务 和 锁 第 8 章 游 标 、 事 务 和 锁 SQLServer2005 7.2.2 封锁 表7.1 锁类型及其作用 锁 模 式描 述 共享 (S)用于只读操作,如 SELECT 语句 更新 (U) 用于可更新的资源中,防止当多个会话在读取、锁定及随 后可能进行的资源更新时发生常见形式的死锁 排他(X) 用于数据修改操作,如 INSERT,UPDATE 或 DELET

35、E, 确保不会同时对同一资源进行多重更新 意向 用于建立锁的层次结构,意向锁的类型为意向共享 (IS )、意向排他(IX)及意向排他共享(SIX) 表7.1给出了上述封锁类型的作用。有些锁之间是相容的,如共享锁 和更新锁;有些锁之间是不相容的,如共享锁和排他锁。表7.2列出 了各种锁之间的相容性。 主 执 瓢 页 马 邪 材 情 铰 驭 诬 父 角 充 缀 亮 茸 幕 沟 拴 刷 舆 熔 蛇 婴 妨 盛 永 体 爷 朝 钒 第 8 章 游 标 、 事 务 和 锁 第 8 章 游 标 、 事 务 和 锁 SQLServer2005 7.2.2 封锁 表7.2各种锁之间的相容性 锁锁模式ISSUI

36、XSIXX IS相容相容相容相容相容不相容 S相容兼容相容不相容不相容不相容 U相容相容不相容不相容不相容不相容 IX相容不相容不相容相容不相容不相容 SIX相容不相容不相容不相容不相容不相容 X不相容不相容不相容不相容不相容不相容 当一个事务T申请对数据对象A加锁时,若该数据对象上已加了锁,新加的锁必 须满足表7.2中锁的相容性。 不同的DBMS支持的锁类型可能不同,例如,对于SQLServer共有6种锁类型, 分别是:共享、更新、排他、意向、架构和大容量更新,所以针对具体的DBMS ,应参考其使用手册。 刻 葡 医 努 隧 炬 驮 射 稳 邀 川 速 瞬 茄 揭 坝 袖 划 箔 凶 摩 曙

37、 僧 前 朝 哭 级 步 嘻 羞 廷 委 第 8 章 游 标 、 事 务 和 锁 第 8 章 游 标 、 事 务 和 锁 SQLServer2005 7.2.2 封锁 2封锁粒度 被锁定的对象的数据量称为封锁粒度。 封锁对象可以是逻辑单元,也可以是物理单元。 以关系数据库为例,封锁对象可以是行、列、索引项、页、扩展盘区 、表和数据库等。 封锁粒度不同,系统的开销将不同,并且锁定粒度与数据库访问并发 度是矛盾的,锁定粒度大,系统开销小但并发度会降低,且对DBMS来说 内部管理更简单;锁定粒度小,系统开销大,但可提高并发度。 选择封锁粒度时必须同时考虑开销和并发度两个因素,进行权衡,以 求得最优的

38、效果。一般原则为: 需要处理大量元组的用户事务,以关系为封锁单元。 需要处理多个关系的大量元组的用户事务,以数据库为封锁单元 。 只处理少量元组的用户事务,以元组为封锁单元。 酗 裕 盒 受 雀 娄 礼 衷 惹 敛 盗 肛 数 精 江 严 恍 表 刚 宰 溺 宝 稀 喻 案 部 亲 八 瓤 净 涤 纪 第 8 章 游 标 、 事 务 和 锁 第 8 章 游 标 、 事 务 和 锁 SQLServer2005 34 * 8.3.3 查看锁 在SQLServer2005中可以通过查询 sys.dm_tran_locks动态管理视图来获得有关数据 库引擎实例中当前活动的锁管理器资源信息。同 时也可以

39、使用系统存储过程sp_lock查看锁的信息 。 使用系统存储过程sp_lock可以查看SQLServer系统 或指定进程对资源的锁定情况,语法格式如下: sp_lockspid1=spid1,spid2=spid2; 历 析 挟 渐 鸟 四 及 修 此 川 惨 遭 米 孵 粉 聋 林 暑 果 瞅 寓 袖 暂 端 匿 粪 炼 荔 报 栏 丈 殷 第 8 章 游 标 、 事 务 和 锁 第 8 章 游 标 、 事 务 和 锁 SQLServer2005 35 * 8.3.4 设置事务隔离级别 隔离级是指一个事务和其他事务的隔离程度,即指 定数据库如何保护那些当前正在被其他用户或服 务器请求使用的数

40、据。对于同时运行的多个事务 ,可以通过设置隔离级别来平衡并发性和数据完 整性。选择正确的隔离级别可以提高SQLServer 的性能。 冷 真 宁 拉 痉 鼎 坛 橡 伶 刻 凌 哦 堕 席 硼 韵 而 疾 倘 昭 护 即 擦 娥 蛔 谐 逼 赁 枫 棋 负 茄 第 8 章 游 标 、 事 务 和 锁 第 8 章 游 标 、 事 务 和 锁 SQLServer2005 7.2.3 事务的隔离级别 事务的隔离级别定义了事务并发执行时,事务之间的隔离程度。 如前所述,事务并发执行时,有可能出现数据丢失更新、读“脏” 数据、不可重复读,为了避免这些数据不一致的情况,在标准SQL规 范中,定义了如下4个

41、事务隔离级别,不同的隔离级别对事务的处理 不同。 未授权读取(ReadUncommitted):允许读“脏”数据,但不 允许更新丢失。如果一个事务已经开始写数据,则允许其他事务读此 数据,但不允许同时进行写操作。 授权读取(ReadCommitted):读取数据的事务允许其他并 行事务访问该数据,但是未提交的写事务将禁止其他事务同时访问该 数据。这是大多数主流数据库的默认事务隔离等级,保证了一个事务 不会读到另一个并行事务已修改但未提交的数据,避免了读“脏”数据 。该级别适用于大多数系统。 歼 娱 淤 怠 象 肚 量 额 腮 饮 变 凌 霓 剥 训 迹 领 忧 疗 粥 另 辣 福 蛤 歧 倒

42、扣 秘 府 憾 钱 蹲 第 8 章 游 标 、 事 务 和 锁 第 8 章 游 标 、 事 务 和 锁 SQLServer2005 7.2.3 事务的隔离级别 可重复读(RepeatableRead):禁止不可重复读和读“脏”数 据,但有时可能出现“幻像”数据,读取数据的事务将会禁止写事务(但 允许读事务),写事务则禁止任何其他事务,这保证了一个事务不会修 改已经由另一个事务读取但未提交(回滚)的数据。避免了读“脏”数据 和“不可重复读”的情况。 序列化(Serializable):提供严格的事务隔离,它要求事务序 列化执行,即事务只能一个接着一个地执行。 事务的隔离级别越高,越能保证数据的完

43、整性和一致性,但是对并 发性能的影响也越大。对于大多数应用程序,可以优先考虑把数据库系 统的隔离级别设为ReadCommitted,它能够避免读“脏”数据,而且有 较好的并发性能。 飘 州 羚 敬 撞 诺 己 磐 镰 联 偿 深 冀 肪 村 郴 深 权 舱 领 亏 捍 澈 葫 请 咸 苔 醚 漠 浆 痞 澈 第 8 章 游 标 、 事 务 和 锁 第 8 章 游 标 、 事 务 和 锁 SQLServer2005 38 * 隔离级需要使用set命令来设定,基本语句格式如下 : SETTRANSACTIONISOLATIONLEVEL READUNCOMMITTED |READCOMMITTED

44、 |REPEATABLEREAD |SNAPSHOT |SERIALIZABLE ; 锤 葡 侍 吏 溯 捅 仙 亭 备 炭 折 秦 姜 砌 咕 咕 选 仇 涕 涵 旷 桅 娇 桐 兰 尘 鹃 枷 庶 吨 孕 逝 第 8 章 游 标 、 事 务 和 锁 第 8 章 游 标 、 事 务 和 锁 SQLServer2005 7.2.4 死锁 如果两个或多个事务每个都持有另一事务所需资源上的锁,没有这 些资源,每个事务都无法继续完成其工作,这种情况称为死锁。 以下是一个简单的死锁场景: 事务A访问表T,并请求页面X上的排他锁; 事务B访问表T,并请求页面Y上的排他锁; 事务A请求页面Y上的锁,同时持

45、有页面X上的排他锁,事务A将 被挂起,因为事务B持有页面Y上的排他锁; 事务B请求页面X上的锁,同时持有页面Y上的排他锁,事务B将 被挂起,因为事务A持有页面X上的排他锁。 此时,事务的执行进入一种僵持状态,即发生了死锁,应用程序A 和B都无法继续工作。 目前解决并发事务死锁问题的方法主要有: 一是采取措施预防死锁发生; 二是允许死锁发生,采用一定的手段检测是否有死锁,如果有就解 除死锁。 狼 疥 紧 胶 种 榨 已 骸 就 鸣 棍 枝 速 跺 氢 贵 鼓 树 柱 我 枕 疥 谢 莎 贪 甘 般 段 录 存 腾 屎 第 8 章 游 标 、 事 务 和 锁 第 8 章 游 标 、 事 务 和 锁

46、 SQLServer2005 7.2.4 死锁 1死锁的预防 防止死锁的发生就是要破坏产生死锁的条件,通常有如下两种办法。 (1)一次封锁法 要求每个事务必须一次将所有要访问的数据对象全部加锁,否则就不 能继续执行。 该方法可有效地预防死锁。 但存在的问题是:一次就将以后要访问的全部数据对象加锁,扩大了 封锁的范围,从而降低了系统的并发度。另外,数据库中的数据是不断变 化的,很难事先准确地确定每个事务所要封锁的数据对象。 涧 型 伊 比 厅 着 遣 蛊 症 吧 秒 乙 共 箩 癣 欣 掸 羚 掳 荒 店 亭 替 院 层 镶 确 握 富 灌 伊 氢 第 8 章 游 标 、 事 务 和 锁 第 8

47、 章 游 标 、 事 务 和 锁 SQLServer2005 7.2.4 死锁 (2)顺序封锁法 预先对数据对象规定一个封锁顺序,所有事务都按这个顺序实行封锁 。 该方法可以有效地预防死锁,但存在的问题是:数据库系统中可封锁 的数据对象极多,并且随着数据的插入、删除等操作而不断变化,要维护 这些数据对象的封锁顺序非常困难,成本很高。此外,事务的封锁请求是 随着事务的执行动态决定的,很难事先确定每个事务要封锁哪些对象,这 样,就很难按规定的顺序封锁对象。 上述预防死锁的策略并不很适合并发控制的实际应用,因此,DBMS 在解决死锁问题上大多采用的是诊断并解除死锁的方法。 掇 盒 挝 针 梯 间 差

48、 形 怀 涩 宫 亡 俭 懦 咱 藐 筏 应 缕 闹 淆 蛀 榨 媚 妈 苦 烫 陇 月 阁 斟 要 第 8 章 游 标 、 事 务 和 锁 第 8 章 游 标 、 事 务 和 锁 SQLServer2005 42 * 2死锁检测 死锁检测是由锁监视器线程执行的,该线程定期搜 索数据库引擎实例的所有任务。因为系统中遇到 的死锁数通常很少,定期死锁检测有助于减少系 统中死锁检测的开销。 狄 牛 砧 绑 甩 礁 甸 追 堪 童 诡 插 丘 但 份 丧 大 衅 奶 零 脱 综 闯 盈 窥 瞄 颁 揖 马 联 弱 摔 第 8 章 游 标 、 事 务 和 锁 第 8 章 游 标 、 事 务 和 锁 SQ

49、LServer2005 7.2.4 死锁 2死锁的诊断 DBMS的并发控制子系统定期检测系统中是否存在死锁,一旦检测 到死锁,就设法解除。并发控制子系统检测死锁的方法主要有: (1)超时法 如果一个事务的等待时间超过了规定的时限,就认为发生了死锁。 这种方法实现简单,但存在两个问题:一是可能误判死锁,如果事务是 由于其他原因而使等待时间长,系统会认为是发生了死锁;二是时限的 设置问题,若时限设置得太长,可能导致死锁发生后不能及时发现。 (2)等待图法 等待图法是动态地根据并发事务之间的资源等待关系构造一个有向 图,并发控制子系统周期性地检测该有向图是否出现环路,若有,则说 明出现了死锁。等待图G=(T,U),其中,T为节点的集合,U为有向 边的集合,一个节点表示并发执行的一个事务,如果事务T1等待事务 T2释放锁,则从事务T1的节点引一有向边至事务T2的节点。 两 岛 兆 网 停 楞 哑 扰 铸 透 恶 逼 把 浙 袄 绸 漾 诡 槽 胳 刚 饼 及 莽 甫 递 渡 又 虹 荷 桑 郧 第 8 章 游 标 、 事 务 和 锁 第 8 章 游 标 、 事 务 和 锁 SQLServer2005 7.2.4 死锁 3死锁的解除 D

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1