cmu db p4

news2024/11/27 18:47:19

 在lab4中实现一个基于 2PL 的并发控制方式,自动为并发事务执行加锁解锁,提供可串行化能力并实现可重复读、读已提交、读未提交三种隔离度

  • Lock Manager:锁管理器,利用 2PL 实现并发控制。支持 REPEATABLE_READREAD_COMMITTED 和 READ_UNCOMMITTED 三种隔离级别,支持 SHAREDEXCLUSIVEINTENTION_SHAREDINTENTION_EXCLUSIVE 和 SHARED_INTENTION_EXCLUSIVE 五种锁,支持 table 和 row 两种锁粒度,支持锁升级。
  • Deadlock Detection:死锁检测,运行在一个 background 线程,每间隔一定时间检测当前是否出现死锁,并挑选合适的事务将其 abort 以解开死锁。
  • Concurrent Query Execution:修改之前实现的 SeqScanInsert 和 Delete 算子,加上适当的锁以实现并发的查询。

 

lock manager处理锁请求流程:

  • 当一个新的加锁请求到达时,如果请求队列存在,他在对应资源的请求队列末尾添加一条记录,否则创建一个新的队列。
    • 如果资源没有没有被锁住,那么授予锁。
    • 如果已经有事务获取了锁,检查锁的兼容性,如果兼容并且先前锁请求都被授予,才能获取锁,否则只能等待。这里保证了锁的请求不会饥饿。
  • 当解锁请求到达时,lock manger把对应的加锁记录从请求队列中移除。检查后续等待获取请求能否被授予锁。

以上图为例,对某个表A。

  • t1时刻,txn1 事务发起锁请求,创建了一个新的 request queue,直接授予锁。
  • t2时刻,txn2 事务发起 SIX 锁请求,但是 SIX 与 S 不兼容,所以 txn2 阻塞在队列中
  • t3时刻,txn3 发起 IS 锁请求,尽管 IS 锁与 授予了的S 锁甚至 SIX 锁都兼容,但是因为 txn2 没有被授予,所以 txn3 也不能被授予。
  • t4时刻,txn1解锁,这时 txn2 和 txn3 同时被授予。

具体思路参考:CMU15445-2022 P4 Concurrency Control 

 

 

Deadlock Detection

2PL不可避免的会产生死锁,所以要及时检测死锁打破依赖。这一节比较简单,bustub 会在创建 lock_manger 时,在后台创建一个周期性的死锁检测线程。

利用dfs 查询是否存在圈,释放最后的事务

死锁解除

尽管数据库在死锁问题上普遍采用检测和解除的方法处理死锁,而不是预防。对DBMS预防死锁、活锁的方法还是有必要学习的。

三种主要策略:

一次性封锁(类似于静态资源分配,操作系统知识)
每个事务必须一次将所有要用的数据加锁,否则不能继续执行。

顺序封锁(请求序列,破坏循环等待条件,操作系统知识)
预先为数据对象规定一个封锁顺序,所有事务按照顺序进行封锁。

以上两种方法都不适用,第一种效率很低,第二种执行困难。

第三种方法,也是比较难理解的一种方法:

时间戳(这个按照书面语挺难理解的,下面是我转述的,希望更好理解)
每个事务都给它一个时间戳,当A申请资源锁的时 候,B已经获得了锁,有以下两个策略

wait-die(等待死亡):是一种非剥夺策略,老的事务等待新的事务释放资源,即若A比B老,则等待B执行结束,否则A卷回(roll-back),一段时间后会以原先的时间戳继续申请。老的才有资格等,年轻的全部卷回。
wound-wait(伤害-等待):是一种剥夺策略,如果A比B年轻,A才等待,A比B老,则杀死B,B回滚。换句话说,老事务不等待"你",直接杀死"你",抢占资源,小孩子才等。
等待死亡的特点是不剥夺,但只有老的有资格等待。

伤害等待的特点是老的不等待,直接把你干掉,新的才去等待。

从某种意义上来说,这两者很类似,都是老事务优先(否则就会有饿死现象)

总结
两个方法都保证事务执行是单向的(要么老的等新的(等现存的持有锁的新事务结束,而不是说等所有新的事务申请结束了才执行老的),要么新的等老的),不会出现循环等待,从而避免了死锁,也都确保了老事务的优先权,不会活锁,所以时间戳法是可采纳的。

但二阶段锁也有一些问题:级联回滚(Cascading Aborts)

如下所示,T1释放锁之后,T2事务开始被执行,T2对A的操作是基于T1对A进行临时修改后的版本进行的,如果T1事务没有提交而是被abort了,那么T2必须跟着T1一起回滚(如果T2进行的是读操作,那么这也被称为脏读,"dirty reads")

级联回滚本质上的原因是T2事务在T1事务更新得到的临时版本的数据上进行了操作,那我们可以通过一些手段让T2不在T1修改得到的临时版本上进行操作:比如说,可以让事务先获取各个需要获取的锁,等到它commit时再一次性把这些锁释放掉,这样的话,T2就不可能在临时版本上进行操作,因为当T2能获得锁执行事务时,和它访问共享数据的其他事务已经被提交了。这个方法也被称为严格二阶段锁(Strong Strict 2PL,简称SS2PL),如下图中被红色方框圈出的部分所描述的那样,可以解决脏读的问题

2PL(2 Phase Locking), 锁分两阶段,一阶段申请,一阶段释放

S2PL(Strict 2PL),在2PL的基础上,写锁保持到事务结束

SS2PL( Strong 2PL),在2PL的基础上,读写锁都保持到事务结束

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/646935.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

我五年经验,面试官: “不,你是把一年的工作经验用了五年”

最近看到很多软件测试由于公司裁员而需要重新求职的。他们普遍具有4年甚至更长的工作经验。但求职结果往往都不太理想。 我在与部分软件测试求职者交谈的过程中发现,很多人的工作思路不清晰,技能不扎实,没有持续学习的习惯,但对于…

编程(41) ----------线程池

本篇主要提及线程池的相关内容. 依旧是从最基础的含义开始. 什么是线程池? 在计算机中池的是一个很大的概念, 分为很多种. 但无论是什么池, 其核心都是存取相关数据. 线程池也不例外, 即存放线程的池. 其存在意义与线程异曲同工. 线程产生并使用是因为进程太"重"了…

Andriod开发 ViewPager PageTabStrip

1. ViewPager ViewPager常见于APP的引导页或者产品介绍&#xff0c;左右滑动展示不同页面。 ViewPager用PagerAdapter来绑定数据。PagerAdapter是个抽象类&#xff0c;所以需要写一个子类来实现它。 xml: <?xml version"1.0" encoding"utf-8"?> …

设计模式(十五):行为型之命令模式

设计模式系列文章 设计模式(一)&#xff1a;创建型之单例模式 设计模式(二、三)&#xff1a;创建型之工厂方法和抽象工厂模式 设计模式(四)&#xff1a;创建型之原型模式 设计模式(五)&#xff1a;创建型之建造者模式 设计模式(六)&#xff1a;结构型之代理模式 设计模式…

I2C与I3C

Improved Inter Integrated Circuit &#xff0c;是 MIPI&#xff08;Mobile Industry Processor Interface&#xff09;移动产业处理器接口联盟推出的改进型 i2c (Inter-Integrated Circuit Bus)总线接口。 I3C Introduction I3C &#xff1a;Improved Inter Integrated Cir…

CoreDX DDS应用开发指南(10)通信状态Communication Status

13 Communication Status通信状态 DDS基础设施跟踪与数据通信相关的许多状态和统计信息。应用程序可以选择了解这些状态和统计信息中的一些、全部或全部。 每个DDS实体都有其相关状态,如表13-1所示。 一些通信状态与可用于订阅应用程序的数据相关联。这些被称为读取…

Python发展5大方向,5个对应例子让你更清晰的认知Python!

目录 前言1.数据分析相关路线&#xff1a;案例&#xff1a;使用Python进行股票数据分析 2.人工智能学习路线&#xff1a;案例&#xff1a;使用Python进行图像识别 3.Web开发学习路线&#xff1a;案例&#xff1a;使用Python和Django开发博客网站 4.科学计算学习路线&#xff1a…

(小甲鱼python)类和对象(III)总结 类的继承---构造函数、重写、钻石继承、super()函数

一、基础复习 1.类和对象&#xff08;I&#xff09;总结 类的定义、self的用法 2.类的继承(II)、类的判断isinstance()、issubclass()、多重继承、类的组合 3.类和对象&#xff08;III&#xff09;总结 类的绑定&#xff0c;self&#xff0c;__dict__的妙用 二、类的继承 1.…

4.4.2 译码器

1. 学习基础知识&#xff1a;首先&#xff0c;我会了解译码器的基本概念、原理和应用。通过阅读教科书、参考资料或在线资源&#xff0c;我会学习译码器的工作原理、不同类型的译码器以及它们在电子系统中的应用场景。 2. 研究示例和练习题&#xff1a;为了更好地理解译码器的…

12、Nginx高级之高级模块(secure_link/secure_link_md5)

一、功能 防盗链&#xff1b; ngx_http_secure_link_module模块用于检查所请求链接的真实性&#xff0c;保护资源免受未经授权的访问&#xff0c;并限制链接寿命。 该模块提供两种可选的操作模式。 第一种模式由 secure_link_secret 指令启用&#xff0c;用于检查所请求链接的真…

【Python爬虫开发基础⑤】HTML概述与基本标签详解

专栏&#xff1a;python网络爬虫从基础到实战 欢迎订阅&#xff01;近期还会不断更新~ 往期推荐&#xff1a; 【Python爬虫开发基础①】Python基础&#xff08;变量及其命名规范&#xff09; 【Python爬虫开发基础②】Python基础&#xff08;正则表达式&#xff09; 【Python爬…

出境游复苏加速,距离“回到过去”还有多远?

6月14日一早&#xff0c;日本驻华大使馆一则“自6月19日起正式签发电子签证”的消息&#xff0c;引起了旅游圈的广泛关注。尽管其电子签方案因为流程繁琐甚至超过纸质签证&#xff0c;收获了一片吐槽之声&#xff0c;但游客对出境游的期待&#xff0c;却实打实地得到了展现。 …

solr快速上手:整合SolrJ实现客户端操作(九)

0. 引言 我们前面学习了solr的服务端基础操作&#xff0c;实际项目中我们还需要在客户端调用solr&#xff0c;就像调用数据库一样&#xff0c;我们可以基于solrJ来实现对solr的客户端操作 1. SolrJ简介 SolrJ 是 Solr官方提供的 Java 客户端库&#xff0c;主要用于与 Solr 服…

【Java学习记录-8】集合

集合 特点结构Collection概述创建方式常用方法遍历方式 List概述遍历方式特有方法 特点 提供一种存储空间可变的存储类型&#xff0c;存储的数据容量可以随时发生改变 结构 Collection 概述 是单列集合的顶层接口&#xff0c;它表示一组对象&#xff0c;这些对象也称为Coll…

好用的生产型企业ERP系统有哪些?

一、好用的生产型企业ERP系统有哪些&#xff1f; 目前而言&#xff0c;制造型想要部署一款好用的ERP系统&#xff0c;通常可以从2个方向来考虑&#xff1a; 第一方向&#xff1a;传统IT软硬件。比如&#xff1a;传统ERP厂商SAP&#xff1b; 第二方向&#xff1a;与新一代数字…

基于Java人才招聘网站系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

函数参数的拓展

函数参数的默认值 C 中可以在函数声明时为参数提供一个默认值 当函数调用时没有提供默认参数的值&#xff0c;则使用默认值 参数的默认值必须在函数声明中指定 当函数声明时没有出现参数的默认值&#xff0c;而定义的时候出现参数的默认值&#xff0c;编译器会报错 当函数声…

软件测试面试题:如何测试App性能?

目录 为什么要做App性能测试&#xff1f; 怎么做App性能测试&#xff1f; 下面几款开源工具&#xff1a; APP性能测试关注哪些指标&#xff1f; 总结&#xff1a; 为什么要做App性能测试&#xff1f; 如果APP总是出现卡顿或网络延迟的情况&#xff0c;降低了用户的好感&am…

java面经 MySQL

存储引擎--MyISAM和InnoDB的区别 使用场景 对比 MySQL隔离级别--未提交读&#xff0c;提交读&#xff0c;可重复读&#xff0c;序列化 隔离级别含义 隔离级别 英文名称 含义 脏读 不可重复读 幻读 未提交读 READ UNCOMMITTED 可读取其它事务未提交的结果 √ √ √…

管理类联考——逻辑——真题篇——阅读新题型真题

阅读新题型真题 Part B-2010- Part B Directions: Read the following text and decide whether each of the statements is true or false. Choose T if the statement is true or F if the statement is not true. Mark your answers on ANSWER SHEET. (10 points) Copying…