【数据库】数据库元素的层次,树形结构的下的多粒度加锁,以及幻象的正确处理

news2025/1/17 1:04:18

数据库元素的层次

专栏内容

  • 手写数据库toadb
    本专栏主要介绍如何从零开发,开发的步骤,以及开发过程中的涉及的原理,遇到的问题等,让大家能跟上并且可以一起开发,让每个需要的人成为参与者。
    本专栏会定期更新,对应的代码也会定期更新,每个阶段的代码会打上tag,方便阶段学习。

开源贡献

  • toadb开源库

个人主页:我的主页
管理社区:开源数据库
座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物.

文章目录

  • 数据库元素的层次
  • 前言
  • 概述
  • 多粒度的锁
  • 警示锁
    • 警示协议规则
    • 警示锁相容性矩阵
  • 幻象与插入的正确处理
  • 总结
  • 结尾

前言

随着信息技术的飞速发展,数据已经渗透到各个领域,成为现代社会最重要的资产之一。在这个大数据时代,数据库理论在数据管理、存储和处理中发挥着至关重要的作用。然而,很多读者可能对数据库理论感到困惑,不知道如何选择合适的数据库,如何设计有效的数据库结构,以及如何处理和管理大量的数据。因此,本专栏旨在为读者提供一套全面、深入的数据库理论指南,帮助他们更好地理解和应用数据库技术。

数据库理论是研究如何有效地管理、存储和检索数据的学科。在现代信息化社会中,数据量呈指数级增长,如何高效地处理和管理这些数据成为一个重要的问题。同时,随着云计算、物联网、大数据等新兴技术的不断发展,数据库理论的重要性日益凸显。

因此,本专栏的分享希望可以提高大家对数据库理论的认识和理解,对于感兴趣的朋友带来帮助。

概述

前面我们分享了不同的封锁模式,本文主要介绍数据库元素,也就是加锁的对象,它可能是以树结构出现的,此时就会出现两个问题:

  1. 遇到第一类树结构,是可封锁的层次结构。本文将介绍如何才能既允许大的元素,如表上的锁,又允许包含其中的较小元素上的锁,如块或元组。

  2. 并发控制系统中另一类重要的层次是本身的结组形式就是一棵树,如B-树索引。如果将它看成一个数据库元素进行加锁,那么封锁模式下的性能就会非常低,我们需要一种新的方法;

如何解决和优化这两类问题,将在下文中详细介绍。

多粒度的锁

数据库元素,在前面介绍时并没有特别的说明,因为在不同数据库的实现中各不相同,有整个表,也有数据块,还有表元组。有些应用受益于小的数据库元素,而有的在大的数据库元素下表现更好。

假如给每一个元组提供一个锁,那么对于银行帐户业务,不管有什么样的帐户集合都可以同时更新,但不值得为这样细粒度的锁付出特别大的代价。

作为对照,考虑文档的一个数据库,这些文档可能不时被编辑,但大数据事务将检索整个文档。如果将整个文档作为一个数据库元素,对于同时编辑或查看文档的动作,将不能进行。

这样看来需要使用大粒度锁,又能使用小粒度锁,可以使一些应用更新效率。但是,为了计算表上的聚集而获得了一个表的共享锁,而同时在单个元组上又有排它锁,这可能会导致非可串行化的行为。

下面我们来看一些延伸出来的锁模式。

警示锁

解决管理不同粒度的这一问题的方法,又延伸出来一种新的锁,警示锁,也叫意向锁。如同它的名字,它只是警示的作用,在数据库元素形成嵌套或层次结构时很用作用。

在这里插入图片描述

如上图,可以看表表,块,元组三个层级;

  • 表是最大的可封锁的元素;
  • 每张表是一个或多个块组成;每个块上存储了表的元组;
  • 每个块包含了一个或多个元组;

在数据库元素层次上管理锁的规则由警示协议构成,它既包括普通锁,又包括警示锁。
警示锁的表示,在普通锁S和X的封锁模式前加前缀I表示,如IS表示获取子元素上的一个共享锁意向。

警示协议规则

  1. 要在任何元素上加S或X锁时,我们必须从层次结构的根开始;
  2. 如果处于将要封锁的元素位置时,则不需要进一步查找,请求该元素上的S或X锁。
  3. 如果希望锁的元素位于层次结构的中下时,首先在这一结点上加一个警示锁;也就是说,想要获得其子元素上的共享锁时,先请求该结点上的IS锁,如果想要获得其子节点的排它锁时,先请求该结点上的IX锁,接下来重复这一步,直到到达所需要的结点。

警示锁相容性矩阵

为了更清晰了解警示锁,这里列出了它的相容性矩阵。

ISIXSX
IS
IX
S
X

幻象与插入的正确处理

当事务创建一个可封锁的元素的新的子元素时,有时候可能出错。问题在于,只能封锁已经存在的对象,封锁不存在的但以后可能被插入的数据库元素时,没有简单方法,下面我们来看一个例子。

事务T1,执行select sum(salary) from employ where egroup = 2;
事务T2,向egroup=2的组中插入一条新的元组;

T1执行时,会在表上加上IS锁,并在egroup=2的元组上加上S锁;
T2执行时,看起来不需要锁,但它使T1的结果不正确。

因为对于T1来讲,有一个幻象元组,它没有被加锁,因为加锁时它还不存在。有一种办法是,当需要插入或删除元组时,要在整个表上加X写锁,这样T2需要等待T1结束后才能执行,这样结果就是一致的。

总结

在不同的数据库元素层次下,需要增加锁的类型来防止树形结构整体加锁的问题;当然还需要解决对于幻象的加锁处理。

结尾

非常感谢大家的支持,在浏览的同时别忘了留下您宝贵的评论,如果觉得值得鼓励,请点赞,收藏,我会更加努力!

作者邮箱:study@senllang.onaliyun.com
如有错误或者疏漏欢迎指出,互相学习。

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

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

相关文章

ESP32-Web-Server编程综合项目1-结合 Web Server 实现 WiFi 配网和网页 OTA 更新

ESP32-Web-Server编程综合项目1-结合 Web Server 实现 WiFi 配网和网页 OTA 更新 概述 前述的内容多是一个个小功能的演示,本章节讲述一些实际项目中使用到的综合项目。 首先要讲述的案例是通过ESP32 上的 Web Server 实现对 ESP32 的 WiFi 配网和网页 OTA 更新功…

送女朋友一个猜数字小游戏,猜对了会显示爱心(给你心爱的他或她一个惊喜)

起因是我在学习C语言完成老师布置C语言写一个猜数字的作业,突发奇想,能不能在这个猜对了之后弹出一个不一样的页面,然后就试试看能不能实现。基本思路是这样的: 1:先写一个C语言的猜数字的小游戏,在我上个文…

DevEco Studio 调整开发工具中的字体大小与行高

我们打开编辑器 选择 左上角 File 下的 Settings 将左侧菜单栏 编辑 展开 我们在编辑下面 选择 Font 然后 如下图指向的两个位置 我们可以调整它的字体大小和行高 设置好之后 右下角 点击 Apply 应用 然后点击 OK即可 当然 你按着 Ctrl 然后鼠标滚动 也可以像浏览器那样 拉…

Google Colab 现已支持直接使用 transformers 库

Google Colab,全称 Colaboratory,是 Google Research 团队开发的一款产品。在 Colab 中,任何人都可以通过浏览器编写和执行任意 Python 代码。它尤其适合机器学习、数据分析和教育目的。从技术上来说,Colab 是一种托管式 Jupyter …

面试官:说说Vue中Proxy与Object.defineProperty的用法与区别

前言 面试时,我们说完Vue响应式原理,或者Vue2和Vue3的区别时,通常会引出Vue3使用了Proxy来优化响应式,而面试官会继续深挖:说说Proxy与Object.defineProperty的区别。 我们不能只说Proxy直接代理一个对象&#xff0c…

数据结构之二叉树及面试题讲解

💕"从前种种譬如昨日死;从后种种譬如今日生"💕 作者:Mylvzi 文章主要内容:数据结构之二叉树及面试题讲解 一.概念 1.树的定义 树是一种非线性的数据结构,是由n个结点组成的一种非线性集合&…

10. 哈希表

哈希表(hash table),又称散列表,其通过建立键 key 与值 value 之间的映射,实现高效的元素查询。具体而言,我们向哈希表输入一个键 key ,则可以在 \(O(1)\) 时间内获取对应的值 value 。 给定 n 个学生,每个…

OpenGL ES入门教程(三)之为平面桌子添加混合色

OpenGL ES入门教程(三)之为平面桌子添加渐变色 前言零、OpenGL ES实现混合色的原理一、修改绘制的桌子结构1. 三角形扇介绍2. 基于三角形扇结构绘制平面桌子 二、为每个顶点添加颜色属性三、修改着色器1. 顶点着色器2. 片段这色器 四、绘制具有混合颜色的…

Springboot依赖注入时重复初始化Bean的问题

前言 最近做项目,发现了springboot2.7.x在参数initiate的时候可以反复初始化,而且首次异常后,第二次成功居然也可以启动,通过查看源代码发现了问题根源,且在springboot高版本3.x,就出现了了Configuration的…

springmvc+mybatis+mysql8+idea+jqgrid前端

一、背景 主要是为了学习jqgrid前端技术,熟练一下前后端交互数据 二、效果图 访问地址:http://localhost:8080/cr/views/jqGridDemo.jsp 三、代码展示 控制层JqGridController.java @Controller @RequestMapping("/jqgrid") public class JqGridController {pr…

openEuler学习04-ssl升级到openssl-1.1.1w

当前环境ssl的版本是 1.1.1f ,计划升级到openssl-1.1.1w [roottest ~]# more /etc/os-release NAME"openEuler" VERSION"20.03 (LTS-SP3)" ID"openEuler" VERSION_ID"20.03" PRETTY_NAME"openEuler 20.03 (LTS-SP3)&q…

Selenium自动化测试:通过cookie绕过验证码的操作

验证码的处理 对于web应用,很多地方比如登录、发帖都需要输入验证码,类型也多种多样;登录/核心操作过程中,系统会产生随机的验证码图片,进行验证才能进行后续操作 ​解决验证码的方法如下: 1、开发做个万…

OpenTelemetry系列 - 第2篇 Java端接入OpenTelemetry

目录 一、架构说明二、方式1 - 自动化2.1 opentelemetry-javaagent.jar(Java8 )2.2 使用opentelemetry-javaagent.jar完成自动注入2.3 配置opentelemetry-javaagent.jar2.4 使用注解(WithSpan, SpanAttribute)2.5.1 代码集成WithS…

在Excel中,只需点击几下,就能只复制和粘贴可见单元格

你可以在Excel中隐藏列、行或单元格,以使数据输入或分析更容易。但是,当你复制并粘贴一个包含隐藏单元格的单元格区域时,它们会突然重新出现。 你可能没有意识到,但有一种方法可以只复制和粘贴Microsoft Excel中的可见单元格。只…

SpringMVC常用注解和用法总结

目标: 1. 熟悉使用SpringMVC中的常用注解 目录 前言 1. Controller 2. RestController 3. RequestMapping 4. RequestParam 5. PathVariable 6. SessionAttributes 7. CookieValue 前言 SpringMVC是一款用于构建基于Java的Web应用程序的框架,它通…

FPC和PCB有哪些区别?

现在电子技术越来越先进,CPU可以做到5nm工艺,电路板可以做到几十层,可折叠屏应用多款手机中。 什么是FPC? FPC:Flexible Printed Circuit,柔性电路板,又被称为“软板” FPC 以聚酰亚胺或聚酯薄…

HBASE命令行查看中文字符

问题记录 中文显示的是编码字符不方便查看value\xE5\xB8\xB8\xE5\xAE\x89\xE5\xAE\x891修改前中文显示: 解决方法 1、列族 : 列名 : toString ’2、列族 : 列名 : c(org.apache.hadoop.hbase.util.Bytes).toString ’ scan karry:student,{COLUMNS > [info:…

团队怎么高效制作问卷?

制作调查问卷时并不是一个人就能单独完成,通常情况下,完成一份调查问卷往往需要一个团队的成员参与,相互协作,共同完成。不过,多人协作经常会遇到协作壁垒,导致效率低下,那团队怎么才能高效协作…

K210开发板之VSCode开发环境使用中添加或删除文件(编译失败时)需要注意事项

在最初开始接触,将VScode和编译环境搭载好后,就开始运行第一个程序了,为了后续方便开发测试,这里我自己对照官方提供的例子,自己调试,写了一个简单的文件系统 后续,所有关于开发的源文件都在...…

【无标题】我们只能用成功来摧毁我们,原来的自己只会破败自己的事情。

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…