首页 > 数据库 >数据库总结复习(并发控制三)

数据库总结复习(并发控制三)

时间:2023-11-25 18:05:16浏览次数:34  
标签:封锁 加锁 复习 索引 数据库 并发 粒度 相容 节点

目录

前言

本文为JMU22级数据库原理考前复习而总结归纳,刨除了课本以及课堂上晦涩且长篇大论的文章,以尽量简洁易懂的语句来对知识点进行归纳。

上一篇文章 提到的“封锁粒度”接着对并发控制进行归纳总结。



封锁粒度

概念

即被封锁的数据对象的大小。

封锁对象可以是逻辑上的索引,元组,关系...也可以是物理上的数据页。

封锁粒度越大,并发度越低,但是开销越小。例如,对一个关系加锁,则一次只能修改一行数据,不能多个事务同时对不同元组进行操作,并发度低,但是需要显式加的只是一个锁,开销比较小。

不同操作的加锁粒度需求不同,所以就产生了多粒度封锁协议。


多粒度封锁

我们可以画出一个简单的三级多粒度树:
image

该协议规定,如果对一个节点加锁(显式加锁),那么其后代都要被加上同样的锁(隐式加锁)。

所以当事务想加锁成功,不仅要保证和当前节点已经有的锁相容,还要保证要和它的后代相容。一样的,当前节点的父节点也可能对当前节点有隐式加锁,所以也要保证和它的祖先相容。

那么每次加锁都得遍历一下所有的上下级,这样效率很低。

所以诞生了,意向锁。



意向锁

一个节点要加锁,就要对其所有上级节点都加上对应类型的意向锁。
一个节点被加了意向锁,代表有事务意图向其下级加对应类型的锁。

也就是说,上级节点可以体现出下级的操作,所以判断是否相容就不再需要遍历下级节点了,只需要判断上级节点就行。


类型

  • IS锁 想加S锁就要对所有上级加IS锁。
  • IX锁 想加X锁就要对所有上级加IX锁。
  • SIX锁 S锁+XI锁
  • ...

规则

简单来说就是任意相容锁和相容锁相容。相容锁和普通锁之间比较就去掉相容锁的I,然后比较。
SIX锁是S锁+IX锁,不是纯相容锁。
举例:

  • x锁和SIX锁判断是否相容,需判断x锁和S锁是否相容 以及 x锁和IX锁(即判断x锁和X锁是否相容),显然都不相容。
  • IS锁和SIX锁判断是否相容,需判断IS锁和S锁是否相容(即判断S锁和S锁是否相容) 以及 IS锁和IX锁是否相容,显然都相容。
  • SIX锁和SIX锁判断是否相容,需判断S锁和S锁是否相容 以及 S锁和IX锁是否相容,显然后者不相容。
    image


小结--引出问题

到此已经学了很多封锁规则。

针对三类并发问题引出的封锁协议:

  • 针对丢失修改的一级封锁协议
  • 针对丢失修改和脏读的二级封锁协议
  • 针对不可重复读和丢失修改和脏读的三级封锁协议

针对活锁的

  • 先来先服务(排队)
    针对死锁的
  • 一次封锁
  • 顺序封锁(规定拿多个锁时的锁顺序)

针对可串行化的

  • 两段锁协议

然而,幻读这个并发问题还没有解决。即使是三级封锁协议也没办法,因为加锁都是对已经存在的数据对象,对于即将存入的对象无法加锁。
所以产生了索引锁。



索引锁

对于有索引的数据对象,插入删除这样的改动必然会先导致索引的变动,那么可以加索引锁,这样就无法对索引修改,也就无法做插入删除操作。

标签:封锁,加锁,复习,索引,数据库,并发,粒度,相容,节点
From: https://www.cnblogs.com/lmj00/p/17852794.html

相关文章

  • 并发编程场景题目
    (1)发红包,100块钱,10个红包,要求第一个抢到红包的用户,得到的金额最多?解答:可以先将每个红包的金额计算出来,然后放到一个并发队列中concurrentLinkedQueue,每个用户就是一个线程,每个线程去操作并发集合,集合为空的线程就返回红包派送完了。(2)搜索引擎:公司有三种搜索引擎,每个搜索引擎的搜......
  • 网络安全与基础总复习
    零——复习资料网络安全基础应用与标准(第六版)Netsec中文译版课件第一章——引言CIA三元组机密性(Confidentiality):数据机密性;隐私性完整性(Integrity):数据完整性;系统完整性可用性(Availability)为了使安全场景更全面又提出新的概念,提及较多的有:真实性,可计量性安全的三个......
  • 神通数据库备份恢复过程之二
    神通数据库备份恢复过程之二背景前期总结过神通数据库的备份,但是发现这两边在进行备份呢时效率非常地下因为虚拟机有快照并且是raid6的hdd读写性能非常感人数据库也大约有了100G以上今天就进行一下脚本的更新,提高备份呢的效率学习来源:https://www.jianshu.com/......
  • SQL Server数据库 主键自增标识列设置为默认值重新为1
    关键代码:注意:表格里原存在有的数据自增列不会变更,变更的是重新添加后的自增列......
  • 【Django基础】操作数据库详解
    djangoORM简介O(objects):类和对象。R(Relation):关系,关系数据库中的表格。M(Mapping):映射。DjangoORM框架的功能:建立模型类和表之间的对应关系,允许我们通过面向对象的方式来操作数据库。根据设计的模型类生成数据库中的表格。通过方便的配置就可以进行数据库的切换。......
  • 【Django基础】Mysql数据库连接配置
    Django支持MySQL5.7及以上版本。Django的inspectdb功能使用information_schema数据库,其中包含所有数据库架构的详细数据。Django希望数据库支持Unicode(UTF-8编码),并将执行事务和引用完整性的任务交给它。django连接MySQL数据库,需要安装第三方数据库mysqlclientpip......
  • C++11 多线程并发 互斥量、条件变量和信号量
    互斥量Classesmutex(C++11)providesbasicmutualexclusionfacility(class)timed_mutex(C++11)providesmutualexclusionfacilitywhichimplementslockingwithatimeout(class)recursive_mutex(C++11)providesmutualexclusionfacili......
  • SqlServer 数据库表死锁
    数据库表死锁 spid  锁表进程tableName  被锁表名declare@spid intSet@spid =618--锁表进程declare@sqlvarchar(1000)set@sql='kill'+cast(@spid asvarchar)exec(@sql)select  request_session_id  spid,OBJECT_NAME(resource_associated_entity_i......
  • 构建高效数据流转的 ETL 系统:数据库 + Serverless 函数计算的最佳实践
    作者|柳下概述随着企业规模和数据量的增长,数据的价值越来越受到重视。数据的变化和更新变得更加频繁和复杂,因此及时捕获和处理这些变化变得至关重要。为了满足这一需求,数据库CDC(ChangeDataCapture)技术应运而生。然而,从ETL架构的角度来看,CDC仅满足了数据的提取(Extract)能力。为......
  • 数据库<200b>字符处理
    1.在trino执行SQL报错,如下图2.直接查看值没有什么异常3.通过将值复制到vim中,发现是特殊字符<200b>导致4.查看资料,发现有多种处理方式,但均不支持trino--replace(所在字段,'\u200b','')--使用trim()方法可以去除掉神奇的空格--使用正则表式进行替换replace(/\t+/g,"......