事务处理-锁内容摘要:

if Ti 持有 D上的锁 then read(D) else begin 如果需要,等待直到没有其它 事务在 D上的 X锁 授予 Ti D上的 S锁 read(D) end 锁的实现 write(D) if Ti 持有 D上的 X锁 then write(D) else begin 如果需要,等待直到没有其它 事务在 D上的任何锁 如果 Ti D持有 D上的 S锁 then upgrade(D) else 授予 Ti D上的 X锁 write(D) end 锁的实现  锁管理器  事务向锁管理器发送封锁的申请和释放请求  锁管理器维护一个锁表记录锁的授予情况和处于等待状态的封锁请求  锁表  锁表一般作为内存中的 hash表 , 按被封锁对象的名字建立索引 锁的实现  黑矩形表示已被授予的锁 ,白色表示等待的封锁请求  锁表同时记录锁的类型  新的封锁请求加到对应请求队列的末尾 , 当封锁请求与前面的锁相容时被批注  释放封锁时请求从队列中删除并检查后续请求是否满足  如果事务放弃 , 所有授予的和等待的锁请求都被删除  为提高效率 , 锁管理器会记录每个事务持有锁的情况 锁的实现  如何看待锁  封锁资源  表 “ Authors”、 页面 2 码为 “ 23812”的 元组  锁管理器对资源一无所知 ,它只是 “ memcmp()” 资源类型 资源详细数据 数据库 ID 锁资源格式 325658 5 Object ID 2:328 6 File: Page 2:328:11 9 File: Page: Slot on Page 5 5 5 锁的实现 RID: 8字节 (File, Page, Slot) 除非删除或移到其他地方,否则 RID保持不变;如果删除元组, RID可以重用 RID可以作为封锁资源 固定的 RID 聚集索引 聚集索引 行可以由唯一的聚集码标识 聚集码可以作为封锁资源 二级索引 码 位臵 指针 (RID或聚集索引 ) 二级索引 码和位臵可以作为封锁资源 锁的实现 3 4 6 7 9 10 14 1 7 3 4 6 9 10 14 1 3 4 6 7 9 10 14 1 Read mitted 锁在读完即刻释放,下次读取可能会遇到修改或删除的元组 Repeatable read 被读取的元组锁一直保持,下次读取可能会遇到插入的元组 Repeatable read 被读取的元组以及扫描的范围锁一直保持,避免往扫描范围内插元组 锁的实现 Adams 6 6 Lewis 1 Smith 11 码 位置 (聚集索引 ) 聚集索引 1 Lewis Dan Adams Kim 11 Smith Ken ... ... 6 Adams 6 Hash 0x033807FF9B2C Adams Adams 锁升级 Locking cost Concurrency cost Row Page Table Cost 行锁代价高 、 并发度高 表锁代价低 、 并发度低 锁升级  锁升级  锁升级是将众多细粒度锁转换为较少的粗粒度的锁的过程 , 以削减系统开销  当事务超过它的升级极限时 , 系统自动将行锁和页锁升级为表锁  例如 , 当事务从表中请求行时 , 系统获取受影响的行上的锁 , 并在包含这些行的页和表或者索引上放臵更高级别的意向锁。 当事务控制的锁数量超过了它的极限时 , 系统将表上的意向锁更改为更强的锁 ( 例如 , 将意向排它 (IX) 锁更改为排它 (X) 锁 )。 获取更强的锁后 , 表事务持有的所有页级锁和行级锁都被释放 , 从而削减锁的开销 死锁 (Deadlock)  两个事务都封锁了一些数据对象 , 并相互等待对方释放另一些数据对象以便对其封锁 , 结果两个事务都不能结束 , 则发生死锁 死锁 Connection 1 Connection 2 USE pubs WHILE (1=1) BEGIN BEGIN TRAN UPDATE employee SET lname=39。 Smith‘ WHERE emp_id=39。 PMA42628M‘ UPDATE authors SET au_lname=39。 Jones39。 WHERE au_id=39。 172321176‘ COMMIT TRAN END USE pubs WHILE (1=1) BEGIN BEGIN TRAN UPDATE authors SET au_lname=39。 Jones39。 WHERE au_id=39。 172321176‘ UPDATE employee SET lname=39。 Smith39。 WHERE emp_id=39。 PMA42628M‘ COMMIT TRAN END 死锁  遵从两段锁协议仍可能发生死锁 lockS(A)。 lockX(B)。 wait…... lockS(B) lockX(A) wait…… T1 T2 T1: lockS(A)…lock S(B)… unlock(A)…unlock(B) T2: lockS(A)…lock S(B)… unlock(A)…unlock(B) 死锁  死锁发生的条件 ① 互斥条件: 事务请求对资源的独占控制 ② 等待条件: 事务已持有一定资源 , 又去申请并等待其它资源 ③ 非抢占条件: 直到资源被持有它的事务释放之前 , 不可能将该资源强制从持有它的事务夺去 ④ 循环等待条件: 存在事务相互等待的等待圈 死锁  定理:在条件 ① ② ③ 成立的前提下 , 条件 ④是死锁存在的充分必要条件 事务号 占有资源号 请求资源号T1 R1 R2T2 R3 R1 , R2T3 R2 R3R2 R1 R3 解决死锁的方法  预防死锁  预先占据所需的全部资源 , 要么一次全部封锁要么全不封锁 缺点:难于预知需要封锁哪些数据并且数据使用率低  所有资源预先排序 , 事务按规定顺序封锁数据  使用抢占与事务回滚 , 给每个事务分配一个时间戳 , 若事务 T2所申请的锁已经被 T1持。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。