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

数据库元素的层次

专栏内容

  • 手写数据库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
如有错误或者疏漏欢迎指出,互相学习。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ES6 Promise的用法,async/await异步处理同步化

文章目录 一、什么是promise ?二、await / async ES7的新规范,异步处理同步化 一、什么是promise ? promise是解决异步的方法,本质上是一个构造函数,可以用它实例化一个对象。对象身上有resolve、reject、all&#xff…

树与二叉树堆:经典OJ题集(2)

目录 二叉树的性质及其问题: 二叉树的性质 问题: 一、对称的二叉树: 题目: 解题思路: 二、另一棵树: 题目: 解题思路: 三、翻转二叉树: 题目:…

Linux基础项目开发1:量产工具——页面系统(六)

前言: 前面我们已经将显示系统、输入系统、文字系统、UI系统全部搭建好了,下面就到了开发板页面的布局,也就是实现按钮在开发板页面上的每个位置,下面让我们一起实现页面的搭建与布局设计吧。 目录 一、数据结构抽象 page_manager…

数据结构奇妙旅程之顺序表和链表

꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好,我是xiaoxie.希望你看完之后,有不足之处请多多谅解,让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN …

数据库-PostgreSQL学习笔记

目录 PostgreSQL介绍与安装docker安装腾讯云免费领用1个月 数据库操作连接数据库实例创建数据库查看数据库列表使用数据库删除数据库修改数据库属性 表操作字段类型整数浮点数日期与时间类型字符串类型 DDLCREATEDROPALTER DMLINSERTUPDATEDELETE 查询查询所有数据查询部分列指…

HttpRunner自动化测试之响应中文乱码处理

响应中文乱码: 当调用接口,响应正文返回的中文是乱码时,一般是响应正文的编码格式不为 utf-8 导致,此时需要根据实际的编码格式处理 示例: 图1中 extract 提取title标题,output 输出 title 变量值&#x…

Reactor实战,创建一个简单的单线程Reactor(理解了就相当于理解了多线程的Reactor)

单线程Reactor package org.example.utils.echo.single;import java.io.IOException; import java.net.InetSocketAddress; import java.nio.channels.*; import java.util.Iterator; import java.util.Set;public class EchoServerReactor implements Runnable{Selector sele…

10 分钟解释 StyleGAN

一、说明 G在过去的几年里,生成对抗网络一直是生成内容的首选机器学习技术。看似神奇地将随机输入转换为高度详细的输出,它们已在生成图像、生成音乐甚至生成药物方面找到了应用。 StyleGAN是一种真正推动 GAN 最先进技术向前发展的 GAN 类型。当Karras …

rust入门(rust教程、rust安装方法)

文章目录 Rust开发入门Rust的特性Rust的应用场景Rust安装——环境配置1. 安装rustup具体执行步骤 2. 验证安装 Rust的卸载基本语法变量与数据类型控制流函数 Rust的所有权系统错误处理实战:构建一个小项目创建新项目编写代码运行项目安装相关链接器运行 删除项目 Ru…

第十五届蓝桥杯模拟赛(第二期)

第一题 计算 答案&#xff1a;108 std::cout<<36*30/10; 第二题 快速幂 答案&#xff1a;608 #include<bits/stdc.h> const int mod1e3; #define int long long int qmi(int a,int b) {int res1;while(b){if(b&1) res(res*a)%mod;b>>1;aa*a%mod;}return…

【数据库】基于封锁的数据库调度器,以及等待锁处理的优先级策略

封锁调度器的体系结构 ​专栏内容&#xff1a; 手写数据库toadb 本专栏主要介绍如何从零开发&#xff0c;开发的步骤&#xff0c;以及开发过程中的涉及的原理&#xff0c;遇到的问题等&#xff0c;让大家能跟上并且可以一起开发&#xff0c;让每个需要的人成为参与者。 本专栏会…

Redis中分布式锁的使用

在分布式系统中&#xff0c;如果使用JVM中的同步锁在高并发的场景下仍然会产生线程安全问题。首先我们来查看在多个服务器时为什么会产生线程安全问题&#xff0c;有这样一个案例&#xff0c;有一件商品购买规则为一个用户只能购买一次&#xff0c;如果使用同步锁锁住用户id&am…

C# Spire操作Excel数据透视表

一、概述 数据透视表&#xff08;Pivot Table&#xff09;是一种交互式的表&#xff0c;可以进行某些计算&#xff0c;如求和与计数等&#xff0c;可动态地改变透视表版面布置&#xff0c;也可以重新安排行号、列标和页字段。当改变版面布置时&#xff0c;数据透视表也会按照新…

PMP-01

考纲 需要看的书籍 学习计划

奇技淫巧第9期

今天回顾一下 5~12 月所遇到的零碎知识点。 文章目录 歪门邪道优雅删除“学习资料”快速下载 vscode两种硬盘格式zotero在word中插入参考文献markdown 下划线查看 CPU Linux 命令postgres 无法通过 root 用户操作bash 初学者礼包gitwin 11 edge 浏览器0x80190001 报错 python …

Pycharm调用Conda虚拟环境

参考这个链接的评论区回答&#xff1a;Pycharm调用Conda虚拟环境 笑死&#xff0c;我之前也是这样的&#xff0c;不过好像也能用&#xff0c;搞不懂~

蓝桥杯每日一题2023.12.2

题目描述 蓝桥杯大赛历届真题 - C 语言 B 组 - 蓝桥云课 (lanqiao.cn) 题目分析 答案&#xff1a;3598180 由题目分析可以知道&#xff0c;给小明发的牌一共有13种类型&#xff0c;每种类型的牌一共有四张。对于每种牌&#xff0c;我们都有5种选择&#xff0c;不拿、拿一张、…

WebGL笔记:矩阵缩放的数学原理和实现

矩阵缩放的数学原理 和平移一样&#xff0c;以同样的原理&#xff0c;也可以理解缩放矩阵让向量OA基于原点进行缩放 x方向上缩放&#xff1a;sxy方向上缩放&#xff1a;syz方向上缩放&#xff1a;sz 最终得到向量OB 矩阵缩放的应用 比如我要让顶点在x轴向缩放2&#xff0c;y轴…

ArrayList 与 顺序表 (附洗牌算法)!

曾经我也是一枚学霸&#xff0c;直到有一天想去学渣的世界看看&#xff0c;结果就找不到回去的路了。 目录 1. 线性表 2.顺序表 2.1 接口的实现 3. ArrayList简介 4. ArrayList使用 4.1 ArrayList的构造 4.2 ArrayList常见操作 4.3 ArrayList的遍历 4.4 ArrayList的扩…

分享66个焦点幻灯JS特效,总有一款适合您

分享66个焦点幻灯JS特效&#xff0c;总有一款适合您 66个焦点幻灯JS特效下载链接&#xff1a;https://pan.baidu.com/s/10bqe09IAZt_hbsZlXaxkxw?pwd6666 提取码&#xff1a;6666 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;…