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

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

数据库元素的层次

专栏内容

  • 手写数据库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

相关文章

SQL server数据库如何下载和安装

《SQLserver数据库如何下载和安装》本文指导如何下载安装SQLServer2022评估版及SSMS工具,涵盖安装配置、连接字符串设置、C#连接数据库方法和安全注意事项,如混合验证、参数化查... 目录第一步:打开官网下载对应文件第二步:程序安装配置第三部:安装工具SQL Server Manageme

C#连接SQL server数据库命令的基本步骤

《C#连接SQLserver数据库命令的基本步骤》文章讲解了连接SQLServer数据库的步骤,包括引入命名空间、构建连接字符串、使用SqlConnection和SqlCommand执行SQL操作,... 目录建议配合使用:如何下载和安装SQL server数据库-CSDN博客1. 引入必要的命名空间2.

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

MySQL数据库中ENUM的用法是什么详解

《MySQL数据库中ENUM的用法是什么详解》ENUM是一个字符串对象,用于指定一组预定义的值,并可在创建表时使用,下面:本文主要介绍MySQL数据库中ENUM的用法是什么的相关资料,文中通过代码... 目录mysql 中 ENUM 的用法一、ENUM 的定义与语法二、ENUM 的特点三、ENUM 的用法1

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

嵌入式数据库SQLite 3配置使用讲解

《嵌入式数据库SQLite3配置使用讲解》本文强调嵌入式项目中SQLite3数据库的重要性,因其零配置、轻量级、跨平台及事务处理特性,可保障数据溯源与责任明确,详细讲解安装配置、基础语法及SQLit... 目录0、惨痛教训1、SQLite3环境配置(1)、下载安装SQLite库(2)、解压下载的文件(3)、

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN

MySQL追踪数据库表更新操作来源的全面指南

《MySQL追踪数据库表更新操作来源的全面指南》本文将以一个具体问题为例,如何监测哪个IP来源对数据库表statistics_test进行了UPDATE操作,文内探讨了多种方法,并提供了详细的代码... 目录引言1. 为什么需要监控数据库更新操作2. 方法1:启用数据库审计日志(1)mysql/mariad