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

数据库元素的层次

专栏内容

  • 手写数据库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.mzph.cn/news/194288.shtml

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

相关文章

Bootstrap 5 中文文档 (简体中文)

Bootstrap 5 中文文档 (简体中文): Bootstrap 4 繁體中文手冊 (中文(繁體))Bootstrap 5 繁體中文手冊 (中文(繁體))Bootstrap 5 中文文档 (Simplified Chinese)

linux内核bio子系统学习记录一:

bio子系统学习一: 主要源码目录 :block/bio.c include/linux/bio.h 内核版本:4.19.1 这部分先总结下bio子系统的初始化部分,后续再总结bio的申请以及释放,还有其它api的使用等介绍。 bio的涉及到频繁的内存申请以及释放&#x…

(学习笔记)Xposed模块编写(一)

前提:需要已经安装Xposed Installer 1. 新建一个AS项目 并把MainActvity和activity_main.xml这两个文件删掉,然后在AndriodManifest.xml中去掉这个Activity的声明 2. 在settings.gralde文件中加上阿里云的仓库地址,否则Xposed依赖无法下载 m…

【llm使用】ChatGLM3-6B Transformers部署调用

文章目录 环境准备模型下载代码准备部署 说明:本文转自国内开源组织datawhale的repo: self-llm 环境准备 在autodl平台中租一个3090等24G显存的显卡机器,如下图所示镜像选择PyTorch–>2.0.0–>3.8(ubuntu20.04)–>11.8 接下来打…

windows 系统读取 Linux Ext 分区硬盘

windows 系统读取 Linux Ext 分区硬盘 起因是需要处理一些在硬盘中的数据,硬盘插到我的电脑上后无法读盘,在 Windows 存储管理器中查看显示未分配,需要格式化,但是在 Ubuntu 系统的电脑中可以正常识别,试验了几次后发…

.NET8构建统计Extreme Optimization Numerical Libraries

为 .NET 8 构建统计应用程序 Extreme Optimization Numerical Libraries for .NET V8.1.22 添加了对 .NET 8 的支持,使您可以使用最新版本的 Microsoft 平台。 Extreme Optimization Numerical Libraries for .NET 是通用数学和统计类的集合,为技术和统计…

关于清空ant.design 中表单内容的方法

关于清空ant.design 中表单内容的方法 其实就两个方法具体怎么清除一个一个试试就知道了 表单有两个可能的属性: formformRef 可以用他们绑定两个用法在代码部分定义: form useRef()form Form.useForm() 清空的方法: form.current?…

【Linux】第二十六站:软硬链接

文章目录 一、软链接二、硬链接三、ln命令四、该如何理解硬链接?五、如何理解软链接六、为什么要用软硬链接1.软链接的应用场景2.硬链接的应用场景 一、软链接 如下所示,我们创建一个文件以后,然后执行下面的指令 ln -s file.txt soft-link…

C++模拟实现unordered_map和unordered_set

目录 1.了解哈希表 1.哈希表 1.他的实现原理就是: ​编辑 2.写单个数据的类型(这边先模拟map的kv类型,后面会再一起改,这边先一步步的先简单实现他) 3.封装整个类: 4.哈希表中存储string 2.哈…

前后端分离部署https

引用:https://blog.csdn.net/weixin_35676679/article/details/127841598 前后端部署,,一般用的是nginx和java,,, 下载SSL证书: java配置https 将证书配置到springboot中 server:port: 544…

线程...

文章目录 1.Linux中线程该如何理解2.重新定义线程 和 进程3.重谈地址空间 --- 第四讲4.Linux线程周边的概念 线程:是进程内的一个执行分支。线程的执行粒度,要比进程要细 很多教材喜欢这么说,这只是一个线程的特征之一,来解释线程。 1.Linux中线程该如何…

基于51单片机的交通灯_紧急开关+黄灯倒计时+可调时间

51单片机交通灯_紧急开关黄灯倒计时可调时间 开题报告系统硬件设计主控制器选择系统硬件结构图时钟及复位电路指示灯及倒计时模块 倒计时模块:程序软件主流程框架main函数 设计报告资料清单资料下载链接 基于51单片机交通灯_紧急开关黄灯倒计时可调时间 仿真图prote…

题目:神奇的进制

解题思路: 用电脑自带的计算器,切换到程序员模式。里面有进制转换功能。 由题目,要求严格递增且都为字母,还要大于2023,则数字16进制为ABC。

【STM32】电机驱动

一、电机分类 二、直流电机的分类 1.有刷电机 2.无刷电机 3.直流减速电机 三、H桥电路 正向旋转 驱动Q1和Q4 反向旋转 驱动Q2和Q3 四、MC3386电机驱动芯片 1.基本原理图 1)前进/后退:IN1和IN2的电平顺序决定电机的正反转 2)调节速度&#…

ARM Cortex-A、Cortex-M和Cortex-R简介

ARM Cortex-A,Cortex-M和Cortex-R是ARM处理器系列的不同产品线,针对不同的应用场景和要求进行了优化。以下是它们之间的主要区别: 1. 应用场景:Cortex-A系列处理器主要用于高性能计算设备,例如智能手机、平板电脑、个…

Redis对象

Redis根据基本数据结构构建了自己的一套对象系统。主要包括字符串对象、列表对象、哈希对象、集合对象和有序集合对象 同时不同的对象都有属于自己的一些特定的redis指令集,而且每种对象也包括多种编码类型,和实现方式。 Redis对象结构 struct redisOb…

Linux 防火墙

目录 安全技术 防火墙的分类 按保护范围划分 按实现方式划分 按网络协议划分 应用层防火墙(7层) 防火墙的工作原理 linux防火墙的基本认识 防火墙工具介绍 1.iptables 2.firewalld 3.nftables 安全技术 —— 入侵检测系统(Intru…

Python 文件错误 SyntaxError: Non-Ascii Character \xe2

此错误表明您正在代码中写入非 ASCII 字符。 在编译时,解释器感到困惑并抛出 SyntaxError: Non-ASCII character ‘\xe2’ 。 ASCII 字符使用与 UTF-8 的前 128 个字符相同的编码,因此 ASCII 文本与 UTF-8 兼容。 首先,您必须了解 ASCII 字符…

centos7中通过kubeadmin安装k8s集群

k8s部署官方提供了kind、minikube、kubeadmin等多种安装方式。 其中minikube安装在之前的文章中已经介绍过,部署比较简单。下面介绍通过kubeadmin部署k8s集群。 生产中提供了多种高可用方案: k8s官方文档 本文安装的是1.28.0版本。 建议去认真阅读一下…

使用coco数据集进行语义分割(1):数据预处理,制作ground truth

如何coco数据集进行目标检测的介绍已经有很多了,但是关于语义分割几乎没有。本文旨在说明如何处理 stuff_train2017.json stuff_val2017.json panoptic_train2017.json panoptic_val2017.json,将上面那些json中的dict转化为图片的label mask&am…