1. Overview

前面一小节(并发控制理论)介绍了如何并发执行多个事务,设置检测机制判断执行调度满足可串行化。那些方法假设DBMS已知所有负载,然而,在真实系统中,系统往往并不知道用户在未来可能发送的所有请求,在这种情况下如何保证最终产生可串行化调度是一个新的问题。本小节介绍的两阶段封锁协议(2PL)是其中一种解决方式,它是一种悲观的解决策略,相应的,还有一类乐观的解决策略。

2. Lock Types

在索引并发控制那一小节提到过,Lock和Latch的区别。Latch指物理层面对数据结构的锁,Lock指对逻辑层面的事务、数据库对象的锁。

锁的类型分为读锁和写锁,读锁之间不互斥,写锁与任意的锁都互斥。

为了在事务并发过程中避免读写冲突,可以使用锁对对象进行管理,Lock Manager中记录当前锁的分配情况。

下图是一个使用锁实现数据对象原子访问的例子,但仅仅这样这还不够,下面的例子不满足可串行化,出现了不可重复读的问题。

两阶段封锁(2PL)是一种能够无需提前知道未来所有事务内容的情况下保证调度冲突可串行化的一种并发协议。

两阶段封锁顾名思义分为两个阶段,分别是Growing阶段和Shrink阶段。在Growing阶段,事务从Lock Manager处获得执行事务所需要的所有数据对象的锁;随后进入Shrink阶段,只能释放Growing阶段获得的锁,不能够重新获取新的锁。

Shrink阶段,只能释放Growing阶段获得的锁,不能够重新获取新的锁(避免了提到的脏读问题)。

下面是一个运用2PL执行事务T1和事务T2的例子。

到目前为止介绍的2PL还不够完美,还会发生级联中止的问题(cascading abort)。

例如下图所示,若T1最终ABORT掉,由于T2已经读了T1写后的值,出现脏读问题,导致T2也要中止。若级联中止导致了DBMS事务冲突率较高,成功提交的事务变少影响性能,可以通过Strong Strict 2PL彻底避免。

Strong Strict 2PL指只有等到事务最终执行完,决定COMMIT前再释放所有锁(这里一直有个疑问,就是会不会COMMIT失败?)。

可以看出,Strong Strict 2PL可以彻底避免级联中止的问题,但这是一个trade-off的过程,使用Strong Strict 2PL的同时也降低了执行的并行度。

下图是一个使用Strong Strict 2PL计算A+B的例子,T2直到T1决定COMMIT了才能够获得A的写锁。

几种调度的关系如图所示。

到目前为止介绍的2PL还可能发生死锁的问题,如下图所示,T1和T2因为互相争用锁而发生死锁。

在发生事务死锁情况下,Wait For 图表现出是一个环。处理死锁的方式可以通过死锁检测或者提前预防死锁的发生。

对于死锁的检测,Wait For 图可以判断调度中是否有死锁,与上一小节介绍的冲突依赖图不同的是,对于依赖图中冲突的两个事务,先执行的事务指向后发生的事务;Wait For 图中的有向边Ti->Tj表示事务Ti等待事务Tj释放锁。

下图所示是一个死锁的例子。

一旦检测到有死锁产生,DBMS会回滚部分事务打破死锁状态,从而能够让系统继续运行,被回滚的事务重新执行。

允许根据不同规则来选择回滚的事务,目的还是想要回滚带来的损失最小,同时也要避免starvation(饥饿)问题。

同时,被回滚的事务可以考虑只回滚事务中导致死锁的操作,剩余的操作不回滚,减少回滚带来的损失。

也可以通过设置预防机制彻底避免死锁的发生,如下图所示的两种策略。第一种策略统一按照时间戳顺序发放锁,第二种相反,通过规定统一的锁分配策略来避免死锁的发生。

下图分别两种机制对锁争用的处理。

若一个查询涉及1000万行记录,lock manager同时管理1000万个锁将会造成较低的处理性能。

通过层级化锁可以达到对大规模tuple上锁的目的。

具体而言,这种锁叫Intention Lock。

IS、IX、SIX互斥情况。

下图是T1、T2、T3通过层次化锁实现并发执行的例子。

这种层级化锁机制优化了需要获取大规模锁的查询性能,同时也考虑了查询的并发性。

[CMU 15-445] 17 两阶段封锁协议相关推荐

  1. mysql二级封锁协议_MySQL 行锁、两阶段锁协议、死锁以及死锁检测

    行锁 MySQL的行锁都是在引擎层实现的,但是 MyISAM 不支持行锁,意味着并发控制只能使用表锁,同一张表任何时刻只能被一个更新在执行,影响到业务并发度.InnoDB 是支持行锁的,这也是 MyI ...

  2. Mysql的两阶段锁协议

    问题引入 我们都知道事务的四大特性,ACID,原子性.一致性.隔离性.持久性.那么事务是如何实现这样的特性的呢?其中原子性通过redo.undo.binlog日志来实现:持久性通过mysql底层的刷磁 ...

  3. mysql中的两段锁协议和三级封锁协议

    两段锁协议 一个事务中一旦开始释放锁,就不能再申请新锁了.事务的加锁和解锁严格分为两个阶段,第一阶段加锁,第二阶段解锁. 目的 :"引入2PL是为了保证事务的隔离性,保证并发调度的准确性,多 ...

  4. 详解PostgreSQL数据库中的两阶段锁

    点击上方"蓝字" 关注我们,享更多干货! 数据库中的对象是共享的,假如不同的用户同时修改某个对象,就会出现数据错乱,从而破坏数据库的数据一致性,违反事务的隔离性原则. 为了满足隔离 ...

  5. 【数据库技术】2PL(两阶段锁)下的死锁与饥饿处理手段

    事务处理-2PL下的死锁与饥饿 2PL--2阶段锁存在的问题 一.死锁与等待图 1. 死锁(Deadlock) 2. 等待图(Wait-for graph) 二.死锁的处理手段 1. 死锁预防 2. ...

  6. (数据库系统概论|王珊)第十一章并发控制-第五、六、七节:并发调度的可串行性、两段锁协议和封锁的粒度

    文章目录 一:可串行化调度 二:冲突可串行化调度 (1)冲突操作 (2)可串行化调度的充分条件:冲突可串行化 三:两段锁协议 四:封锁的粒度 (1)概念 (2)选择封锁的原则 (3)多粒度封锁 A:多 ...

  7. CAP原理,分布式一致性算法,两阶段提交,三阶段提交,Paxos,Raft,zookeeper的选主过程,zab协议,顺序一致性,数据写入流程,节点状态,节点的角色

    我们知道,一般在分布式应用都有CAP准则: C Consistency, 一致性,分布式中的各个节点数据保持一致 A availability 可用性,任何时刻,分布式集群总是能够提供服务 P par ...

  8. 【眼见为实】数据库并发问题 封锁协议 隔离级别

    目录 序 数据库并发的几大类问题 ①丢失修改(Lost Update) ②不可重复读(Non-Repeatable Read) ③幻读(Phantom Read) ④读脏数据(Dirty Read) ...

  9. 事务管理基础:两段锁协议、活锁、死锁相关知识整理

    1.两段锁协议(Two-phase Locking Protocol)  两段锁协议是指对任何数据进行读写之前必须对数据进行加锁:在释放一个封锁之后,事务不再申请和获得任何其他封锁. 两段锁协议中两段 ...

  10. (数据库系统概论|王珊)第十一章并发控制-第二、三、四节:封锁、封锁协议活锁和死锁

    文章目录 一:封锁 (1)概念 (2)类型 (3)控制方式 二:封锁协议 (1)概念 (2)三级封锁协议 ①:一级封锁协议 ②:二级封锁协议 ③:三级封锁协议 三:活锁和死锁 (1)活锁 (2)死锁 ...

最新文章

  1. 风投报告:2017下半年VR/AR娱乐领域投资额同比上升79% 【52翻译】
  2. 【Luogu1937】仓配置(贪心,线段树)
  3. Linux系统直接升级GLIBC版本
  4. 收藏老外的jquery web 按钮插件
  5. 线段树动态开点 - - - > 线段树合并
  6. 利用ioctl获取本机指定设备的MAC地址
  7. Flask 第三方组件之 SQLAlchemy
  8. 小甲鱼 OllyDbg 教程系列 (十五) : 逆向注册机简单算法
  9. Block的循环引用
  10. linux 如何查看进程端口号,在linux中查看进程占用的端口号
  11. Elastic-jobQuartz定时任务
  12. poi导出excel写入公式_POI导出Excel增加公式核心代码
  13. java简历专业技能,附详细答案解析
  14. 人工智能基础入门——神经网络讲解
  15. 扫描到计算机桌面,win7怎么扫描文件到电脑上?扫描文件到win7电脑的两种方法...
  16. bessel 函数乘以指数函数的积分
  17. xp计算机管理员桌面文件没有权限,电脑中右击文件没有以管理员身份运行选项怎么办...
  18. 英语3500词(15/20)crime主题(2022.1.27)
  19. 一家有两个孩子,已知至少有一个孩子是在星期二出生的男孩。问:两个孩子都是男孩的概率是多大?
  20. 对前端特效感兴趣的同学可以留意下这些例子,有点意思

热门文章

  1. 对封装、继承、多态的简单理解
  2. javaScript 对象大全 (javascript code al 2)(转转)
  3. msfvenom生成后门程序及利用
  4. 笔试题:输入0123456789对应输出“一二三四五六七八九”
  5. python基础五之for和while
  6. ASML大举向中国出口光刻机,或在于忧虑中国光刻机技术取得突破
  7. 服务器怎么连接无线路由器怎么设置,光猫连接无线路由器怎么设置
  8. Python3安装turtle报错 File “/tmp/pip-install-hpqxw6_s/turtle/setup.py”, line 40
  9. PP视频(PPTV聚力)web接口分析
  10. 《中国人史纲》读书笔记:第六、七章 纪元前八、七世纪