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

本文主要是介绍【数据库】数据库元素的层次,树形结构的下的多粒度加锁,以及幻象的正确处理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

数据库元素的层次

专栏内容

  • 手写数据库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.chinasem.cn/article/451903

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

MySQL数据库宕机,启动不起来,教你一招搞定!

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等)公众号:老苏畅谈运维欢迎关注本人公众号,更多精彩与您分享。 MySQL数据库宕机,数据页损坏问题,启动不起来,该如何排查和解决,本文将为你说明具体的排查过程。 查看MySQL error日志 查看 MySQL error日志,排查哪个表(表空间

hdu1011(背包树形DP)

没有完全理解这题, m个人,攻打一个map,map的入口是1,在攻打某个结点之前要先攻打其他一个结点 dp[i][j]表示m个人攻打以第i个结点为根节点的子树得到的最优解 状态转移dp[i][ j ] = max(dp[i][j], dp[i][k]+dp[t][j-k]),其中t是i结点的子节点 代码如下: #include<iostream>#include<algorithm

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

自定义类型:结构体(续)

目录 一. 结构体的内存对齐 1.1 为什么存在内存对齐? 1.2 修改默认对齐数 二. 结构体传参 三. 结构体实现位段 一. 结构体的内存对齐 在前面的文章里我们已经讲过一部分的内存对齐的知识,并举出了两个例子,我们再举出两个例子继续说明: struct S3{double a;int b;char c;};int mian(){printf("%zd\n",s

深入理解数据库的 4NF:多值依赖与消除数据异常

在数据库设计中, "范式" 是一个常常被提到的重要概念。许多初学者在学习数据库设计时,经常听到第一范式(1NF)、第二范式(2NF)、第三范式(3NF)以及 BCNF(Boyce-Codd范式)。这些范式都旨在通过消除数据冗余和异常来优化数据库结构。然而,当我们谈到 4NF(第四范式)时,事情变得更加复杂。本文将带你深入了解 多值依赖 和 4NF,帮助你在数据库设计中消除更高级别的异常。 什么是

DM8数据库安装后配置

1 前言 在上篇文章中,我们已经成功将库装好。在安装完成后,为了能够更好地满足应用需求和保障系统的安全稳定运行,通常需要进行一些基本的配置。下面是一些常见的配置项: 数据库服务注册:默认包含14个功能模块,将这些模块注册成服务后,可以更好的启动和管理这些功能;基本的实例参数配置:契合应用场景和发挥系统的最大性能;备份:有备无患;… 2 注册实例服务 注册了实例服务后,可以使用系统服务管理,

速了解MySQL 数据库不同存储引擎

快速了解MySQL 数据库不同存储引擎 MySQL 提供了多种存储引擎,每种存储引擎都有其特定的特性和适用场景。了解这些存储引擎的特性,有助于在设计数据库时做出合理的选择。以下是 MySQL 中几种常用存储引擎的详细介绍。 1. InnoDB 特点: 事务支持:InnoDB 是一个支持 ACID(原子性、一致性、隔离性、持久性)事务的存储引擎。行级锁:使用行级锁来提高并发性,减少锁竞争

遮罩,在指定元素上进行遮罩

废话不多说,直接上代码: ps:依赖 jquer.js 1.首先,定义一个 Overlay.js  代码如下: /*遮罩 Overlay js 对象*/function Overlay(options){//{targetId:'',viewHtml:'',viewWidth:'',viewHeight:''}try{this.state=false;//遮罩状态 true 激活,f

开源分布式数据库中间件

转自:https://www.csdn.net/article/2015-07-16/2825228 MyCat:开源分布式数据库中间件 为什么需要MyCat? 虽然云计算时代,传统数据库存在着先天性的弊端,但是NoSQL数据库又无法将其替代。如果传统数据易于扩展,可切分,就可以避免单机(单库)的性能缺陷。 MyCat的目标就是:低成本地将现有的单机数据库和应用平滑迁移到“云”端