【数据库】数据库元素的层次,树形布局的下的多粒度加锁,以及幻象的正确处
数据库元素的层次专栏内容:
[*]手写数据库toadb
本专栏主要介绍如何从零开发,开发的步调,以及开发过程中的涉及的原理,遇到的问题等,让各人能跟上并且可以一起开发,让每个须要的人成为加入者。
本专栏会定期更新,对应的代码也会定期更新,每个阶段的代码会打上tag,方便阶段学习。
开源贡献:
[*]toadb开源库
个人主页:我的主页
管理社区:开源数据库
座右铭:天行健,君子以自强不息;阵势坤,君子以厚德载物.
媒介
随着信息技能的飞速发展,数据已经渗透到各个领域,成为现代社会最重要的资产之一。在这个大数据时代,数据库理论在数据管理、存储和处理中发挥着至关重要的作用。然而,许多读者大概对数据库理论感到困惑,不知道如何选择合适的数据库,如何计划有效的数据库布局,以及如何处理和管理大量的数据。因此,本专栏旨在为读者提供一套全面、深入的数据库理论指南,帮助他们更好地理解和应用数据库技能。
数据库理论是研究如何有效地管理、存储和检索数据的学科。在现代信息化社会中,数据量呈指数级增长,如何高效地处理和管理这些数据成为一个重要的问题。同时,随着云计算、物联网、大数据等新兴技能的不停发展,数据库理论的重要性日益凸显。
因此,本专栏的分享希望可以提高各人对数据库理论的认识和理解,对于感兴趣的朋侪带来帮助。
概述
前面我们分享了不同的封锁模式,本文主要介绍数据库元素,也就是加锁的对象,它大概是以树布局出现的,此时就会出现两个问题:
[*] 遇到第一类树布局,是可封锁的层次布局。本文将介绍如何才能既允许大的元素,如表上的锁,又允许包含此中的较小元素上的锁,如块或元组。
[*] 并发控制体系中另一类重要的层次是本身的结组形式就是一棵树,如B-树索引。如果将它看成一个数据库元素举行加锁,那么封锁模式下的性能就会非常低,我们须要一种新的方法;
如何解决和优化这两类问题,将在下文中详细介绍。
多粒度的锁
数据库元素,在前面介绍时并没有特别的说明,因为在不同数据库的实现中各不雷同,有整个表,也有数据块,还有表元组。有些应用受益于小的数据库元素,而有的在大的数据库元素下体现更好。
假如给每一个元组提供一个锁,那么对于银行帐户业务,不管有什么样的帐户聚集都可以同时更新,但不值得为这样细粒度的锁付出特别大的代价。
作为对照,考虑文档的一个数据库,这些文档大概不时被编辑,但大数据事件将检索整个文档。如果将整个文档作为一个数据库元素,对于同时编辑或检察文档的动作,将不能举行。
这样看来须要使用大粒度锁,又能使用小粒度锁,可以使一些应用更新效率。但是,为了计算表上的聚集而得到了一个表的共享锁,而同时在单个元组上又有排它锁,这大概会导致非可串行化的举动。
下面我们来看一些延伸出来的锁模式。
警示锁
解决管理不同粒度的这一问题的方法,又延伸出来一种新的锁,警示锁,也叫意向锁。犹如它的名字,它只是警示的作用,在数据库元素形成嵌套或层次布局时很用作用。
https://i-blog.csdnimg.cn/blog_migrate/10db482a796c9ba37703a4a5ddd61611.png#pic_center
如上图,可以看表表,块,元组三个层级;
[*]表是最大的可封锁的元素;
[*]每张表是一个或多个块构成;每个块上存储了表的元组;
[*]每个块包含了一个或多个元组;
在数据库元素层次上管理锁的规则由警示协议构成,它既包括普通锁,又包括警示锁。
警示锁的表示,在普通锁S和X的封锁模式前加前缀I表示,如IS表示获取子元素上的一个共享锁意向。
警示协议规则
[*]要在任何元素上加S或X锁时,我们必须从层次布局的根开始;
[*]如果处于将要封锁的元素位置时,则不须要进一步查找,哀求该元素上的S或X锁。
[*]如果希望锁的元素位于层次布局的中下时,首先在这一结点上加一个警示锁;也就是说,想要得到其子元素上的共享锁时,先哀求该结点上的IS锁,如果想要得到其子节点的排它锁时,先哀求该结点上的IX锁,接下来重复这一步,直到到达所须要的结点。
警示锁相容性矩阵
为了更清晰了解警示锁,这里列出了它的相容性矩阵。
ISIXSXIS是是是否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
如有错误大概疏漏接待指出,相互学习。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]