数据库-第十一章 并发控制【期末复习|考研复习】

前言

总结整理不易,希望大家点赞收藏。

给大家整理了一下数据库系统概论中的重点概念,以供大家期末复习和考研复习的时候使用。
参考资料是王珊老师和萨师煊老师的数据库系统概论(第五版)。


数据库系统概论系列文章传送门:
第一章 绪论
第二/三章 关系数据库和标准语言SQL
第四/五章 数据库安全性和完整性
第六/七章 关系数据理论和数据库设计
第八/九章 数据库编程和优化
第十章 数据库恢复技术
第十一章 并发控制


文章目录

  • 前言
  • 第十一章 并发控制
    • 11.1 并发事务概述
    • 11.2 并发控制技术
    • 11.3 并发控制的可串行性
    • 11.4 两段锁协议
    • 11.5 多粒度封锁
    • 11.6 其他并发控制机制
    • 11.7 MVCC(背八股文的时候顺便加上了,我觉得这不会考)
      • 11.7.1 当前读和快照读
      • 11.7.2 隔离级别
      • 11.7.3 redolog和undolog
      • 11.7.4 MVCC实现原理
    • 11.8 数据库管理系统层次结构
    • 11.9 分布式数据库
  • 练手题
    • 12.1
    • 12.2
  • 总结


第十一章 并发控制

11.1 并发事务概述

并发控制机制:当多个用户并发存取数据库时就会产生多个事务同时存取同一数据的情况,可能会存取不正确的数据。为了保证事务的隔离性和一致性,数据库管理系统需要对并发操作进行正确调度。
事务是并发控制的基本单位。
并发控制带来的数据不一致性:丢失修改、不可重复读、读“脏”数据
(1)丢失修改:T1,T2同时读(这时读到的数据是一样的),T1对 其操作后,T2对其操作导致T1的操作丢失。
(2)不可重复读:(两个事务先后读取同一条记录,但两次读取的数据不同)①T1读后,T2修改数据,T1再读发现值不同
②T1读后,T2删除
③T1读后,T2插入(后两种有时也叫幻影现象)
(3)幻读:一个事务按照条件查询数据时,没有对应的数据行,但是再插入数据时,又发现这行数据已经存在
(4)读脏数据:(一个事务读到另一个事务还没提交的数据)T1操作后,T2读,T1由于某种原因撤销操作。导致T2读到的数据和数据库内容不一样。

11.2 并发控制技术

并发控制技术:封锁(locking),时间戳(timestamp),乐观控制法(optimistic scheduler),多版本并发控制(MVCC)。(ps:并发控制concurrency control)
(1) 封锁(大重点)
排他锁X锁(exclusive lock),写锁:事务T对对象A上写锁,T可对A进行读写,但其他事务都不能对A上任何类型的锁。直到T释放A为止。
共享锁S锁(share lock),读锁:事务T对对象A上读锁,则T可以读A,但不能写,其他事务只能对A上读锁不能加写锁,直到T释放A上的S锁为止。
(2)三级封锁协议(规定一些规则,避免并发操作出现问题)
一级封锁协议:事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。(在写之前加X锁,防止丢失修改问题)
二级封锁协议:在一级基础上增加事务T在读R之前对其加S锁,读完之后释放S锁。(在读之前加S锁,读完就可以释放。防止丢失修改,脏数据问题)
三级封锁协议:在一级基础上增加事务T在读R之前对其加S锁,直到事务结束后才释放。(在读之前加S锁,事务结束才能释放。防止丢失修改,脏数据,不可重复读的问题)
(3) 活锁和死锁
活锁:某一事务永远处于等待状态。解决方法:先来先服务。
死锁:两个事务相互等待。
死锁预防:
(1)一次封锁法:要求每个事务必须一次对所有要使用的数据全部加锁。
(2)顺序封锁法:预先规定一个不会发生死锁的顺序,然后按照这个顺序严格加锁。
数据库解决死锁问题:诊断并解除死锁。
(1) 超时法
(2)等待图法。
通常采用的方法:选择一个处理代价最小的事务,将其撤销,释放此事务上所有的锁。使得其他事务能够继续运行下去。

11.3 并发控制的可串行性

可串行化调度:多个事务并发执行是正确的,当且仅当其结果与按某一次序结果相同。则称为是可串行化调度。
可串行性是并发事务正确调度的准则。
冲突操作是指不同事务对同一个数据的读写操作和写写操作。
一个操作在保证冲突操作次序不变的情况下,交换两个事务的不冲突操作次序得到另一个调度,如果此调度是串行的。则原调度是冲突可串行化的调度。冲突可串行化是可串行化的充分条件,不是必要条件。

11.4 两段锁协议

两段锁协议:所有事务必须分成两个阶段对数据加锁和解锁。
扩展阶段和收缩阶段:扩展阶段:只允许申请但是不能释放;收缩阶段:只能释放不能申请
是可串行化调度的充分条件,但可能会发生死锁。

11.5 多粒度封锁

显示搜索适应事物的要求直接加到数据对象上的资源。隐式封锁是该数据对象没有被独立加锁,是由其上级节点加锁而使该数据对象加上了锁。
意向锁的含义是如果一个节点加意向锁,则说明该节点的下层节点正在被加锁。
意向锁分为三种,意向共享锁IS锁(后裔加点拟加S锁),意向排他锁IX锁(后裔加点拟加X锁),共享意向排他锁SIX锁(先加S锁,后加IX锁,表示要读整张表并且更新个别元组)。

11.6 其他并发控制机制

时间戳方法给每个事务盖上一个时间戳,每个事务具有唯一的时间戳,并且按照这个时间戳来解决事务的冲突操作。
乐观控制法又被称为验证方法:认为事务中执行时很少发生冲突,让他自由执行,如果检查该事务发生冲突并影响可串行性则拒绝提交并回滚该事务。乐观锁用于读操作多的场景,悲观锁适用于写操作多的场景。
意向锁:如果一个结点加意向锁,则说明该节点的下层结点正在被加锁。
(节点的层次是数据库——>关系——>元组)
三种意向锁:意向共享锁(IS锁Intent share lock),意向排他锁(IX锁),共享意向排他锁(SIX锁)
IS: 事务要对数据对象加S锁,首先要对其上层加IS锁
IX:(上面那条换成X锁)
SIX锁:对一个数据对象加SIX锁,表示对他加S锁,再加IX锁。
意向锁中:任意事务要对一个数据对象加锁,必须先对他的上层结点加意向锁。

11.7 MVCC(背八股文的时候顺便加上了,我觉得这不会考)

MVCC多版本并发控制,指维护一个数据的多个版本使得读写操作没有冲突。快照读为mysql实现mvcc提供了一个非阻塞读功能。MVCC的具体实现依赖于数据库记录的三个隐藏字段、undo log日志、readview

11.7.1 当前读和快照读

当前读:读取的记录是最新版本读取时还要保证其他并发事务不能修改当前进入会对读取的记录进行加锁。
快照读简单的select就是快照读,快照读读取的版本是可见版本,也有可能是历史版本不加锁是非阻塞读。

11.7.2 隔离级别

在这里插入图片描述

不同的隔离级别会对于快照读有不同的处理方法。Read committed每一次select都会生成一个快照读,Repeatable read开启事务后第一个select语句才是快照读的,Serializable快照都会退化为当前读。

11.7.3 redolog和undolog

redo log重做日志记录的是事务提交时数据页的物理修改,有两部分构成重做日志缓冲和重做日志文件。输入每次提交时会将事务刷新到Redo log而不是直接将buffer pool中的数据刷到磁盘ibd文件中。redolog是顺序写,速度快,后台线程伺机采用一定机制再将数据刷新到ibd文件中。
undo log回滚日志用于记录数据被修改前的信息,属于逻辑日志 。

11.7.4 MVCC实现原理

三个隐藏字段:
DB_TRX_ID(最近修改事务ID,记录插入这条记录或最后一次修改该记录的事务ID )、DB_ROLL_PTR(undolog版本链:回滚指针指向这条记录的上一个版本用于配合Undo log指向上一版本,不同事务或相同事务对同一条记录进行修改会导致该记录的Undo log形成1条记录版本链表 链表的头部是最新的旧记录 链表的尾部是最早的旧记录)、
DB_ROW_ID(隐藏主键如果表结构没有指定主键则生成该隐藏字段)。
由read view 来记录并维护系统当前活跃的未提交的事务的ID。readview中包含着当前活跃事务ID的集合、最小活跃事务ID、预分配事务ID 和readview创建者的事务ID。根据版本链数据访问规则来确定是否可以访问该版本。
在RC隔离级别下,在事务中每执行一次快照读生成readview,在RR隔离级别下在事务中第一次执行快照读时生成read view后续会重复使用。
MVCC靠隐藏字段Undo log版本链read view实现的。原子性由Undo log实现,持久性由Redo log实现一致性由Undo log和redo log实现,隔离性由锁和MVCC实现。

11.8 数据库管理系统层次结构

应用层——语言处理层——数据存取层——数据存储层
语言处理层:对数据库语言SQL进行语法分析、视图转换、完整性、安全性检查等,生成可执行代码(编译……)
数据存取层:处理元组,对元组实现增删改查这种操作
数据存储层:数据页和缓冲区,物理层面的管理

11.9 分布式数据库

分布式数据库是由一组数据组成,这组数据分布在计算机网络的不同计算机上,网络中的每个结点具有独立处理的能力,可以执行局部应用。同时,每个结点也能通过网络通信系统执行全局应用。(高度的自治性和整体性)

练手题

12.1

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

12.2

在这里插入图片描述
上一道题是10,这一道题是5,不同年份的练练手,套路都是一样的。

总结

数据库部分也更新完了,以往的章节有些可能和最初发布的版本不一样,新增加了许多题,大家都做做没什么坏处。
祝大家超常发挥!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/444448.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

UE5.2 SmartObject使用实践

SmartObject是UE5新出的一项针对AI的功能,可为开发者提供如公园长椅、货摊等交互对象的统一外观封装,如UE的CitySample(黑客帝国Demo)中就运用到了SmartObject。 但SmartObject实践起来较为繁琐,主要依赖于AI及行为树…

LeetCode-1004. 最大连续1的个数 III

每日一题系列(day 20) 前言: 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 &#x1f50…

ActiveRAG—主动学习

原文地址:ActiveRAG — Active Learning 2024 年 2 月 26 日 大型语言模型(LLM)的出现开创了对话式人工智能的新时代。这些模型可以生成非常类似人类的文本,并且比以往更好地进行对话。然而,他们仍然面临着仅仅依靠预先…

浅析开源内存数据库Fastdb

介绍: Fastdb是免费开源内存数据库,其优秀的性能,和简洁的C代码,让我学习使用过程中收益颇多,但是国内中文相关研究的文章相当稀少,外文我查询相当不便。有兴趣的朋友可以通过以下网站访问:Mai…

Groovy语言

1 Groovy介绍 1.1 Groovy介绍 Groovy是一种编程语言,它结合了Java的强大功能和脚本语言的简洁性。它具有动态类型、易读的语法、与Java的紧密集成、脚本编程能力、强大的闭包等特点。 1.2 Groovy SQL介绍 Groovy SQL是 Groovy 编程语言的一部分,用于…

你应该打好你的日志,起码避免被甩锅

大家好,我是蓝胖子,相信大家或多或少都有这样的经历,当你负责的功能出现线上问题时,领导第一时间便是找到你询问原因,然而有时问题的根因或许不在你这儿,只是这个功能或许依赖了第三方或者内部其他部门,这个…

Spring Boot 自动装配的原理!!!

SpringBootApplication SpringBootConfiguration:标识启动类是一个IOC容器的配置类 EnableAutoConfiguration: AutoConfigurationPackage:扫描启动类所在包及子包中所有的组件,生…

Mint_21.3 drawing-area和goocanvas的FB笔记(七)

FreeBASIC gfx 基本 graphics 绘图 8、ScreenControl与屏幕窗口位置设置 FreeBASIC通过自建屏幕窗口摆脱了原来的屏幕模式限制,既然是窗口,在屏幕坐标中就有它的位置。ScreenControl GET_WINDOW_POS x, y 获取窗口左上角的x, y位置;ScreenC…

小程序网页view多行文本超出隐藏或显示省略号

实现效果: 限制两行,超出即显示省略号 实现:话不多说,展示代码 关键代码 .box{ width:100rpx; overflow:hidden; text-overflow: ellipsis;//超出省略号 display:-webkit-box; -webkit-line-clamp: 2;//显…

【数学】【组合数学】1830. 使字符串有序的最少操作次数

作者推荐 视频算法专题 本博文涉及知识点 数学 组合数学 LeetCode1830. 使字符串有序的最少操作次数 给你一个字符串 s &#xff08;下标从 0 开始&#xff09;。你需要对 s 执行以下操作直到它变为一个有序字符串&#xff1a; 找到 最大下标 i &#xff0c;使得 1 < i…

Android UI自动化测试框架—SoloPi简介

1、UI自动化测试简介 软件测试简介 ​软件测试是伴随着软件开发一同诞生的&#xff0c;随着软件规模大型化&#xff0c;结构复杂化&#xff0c;软件测试也从最初的简单“调试”&#xff0c;发展到当今的自动化测试。 ​ 自动化测试是什么呢&#xff1f;自动化测试是把以人为…

用C语言执行SQLite3的gcc编译细节

错误信息&#xff1a; /tmp/cc3joSwp.o: In function main: execSqlite.c:(.text0x100): undefined reference to sqlite3_open execSqlite.c:(.text0x16c): undefined reference to sqlite3_exec execSqlite.c:(.text0x174): undefined reference to sqlite3_close execSqlit…

从零开始:神经网络(1)——神经元和梯度下降

声明&#xff1a;本文章是根据网上资料&#xff0c;加上自己整理和理解而成&#xff0c;仅为记录自己学习的点点滴滴。可能有错误&#xff0c;欢迎大家指正。 一. 神经网络 1. 神经网络的发展 先了解一下神经网络发展的历程。从单层神经网络&#xff08;感知器&#xff09;开…

349. 两个数组的交集

349. 两个数组的交集 力扣题目链接(opens new window) 题意&#xff1a;给定两个数组&#xff0c;编写一个函数来计算它们的交集。 说明&#xff1a; 输出结果中的每个元素一定是唯一的。 我们可以不考虑输出结果的顺序。 对于看某个元素是否出现在一个集合中的 &#xff0c;…

STM32利用标准库的方式输出PWM(proteus仿真)

首先打开proteus仿真软件&#xff0c;绘制电路图&#xff1a; 其中示波器的添加很简单的&#xff0c;看图&#xff1a; 再来看看咱们最后程序的效果&#xff1a; 下面就是程序代码了&#xff0c;新建两个文件PWM.c和PWM.h文件&#xff0c;所属关系如图&#xff1a; 整个的编程思…

Redis 内存的优化

目录 前言 Redis 的内存碎片问题 判断Redis 内存碎片 如何清理内存碎片&#xff1f; 前言 我想讲一下怎么提高Redis 内存的利用率&#xff0c;redis 的数据是保存在内存中。对内存的利用率低&#xff0c;意味着存的数据很少&#xff0c;并不意味着就没有内存了&#xff0c…

如何在Mapbox GL中处理大的GEOJSON文件

Mapbox GL可以将 GeoJSON 数据由客户端(Web 浏览器或移动设备)即时转换为 Mapbox 矢量切片进行显示和处理。本文的目的是教大家如何有效加载和渲染大型 GeoJSON 源,并优化渲染显示速度,增强用户体验,减少客户端卡顿问题。本文以Mapbox 为例,至于其它框架原理大致相同,可…

中国联通云联网在多元行业应用中的核心地位与价值体现

在全球化浪潮与数字化转型的时代背景下&#xff0c;中国联通积极响应市场需求&#xff0c;推出以云联网为核心的全球化智能组网解决方案&#xff0c;突破地理限制&#xff0c;为各行业提供高效、安全、灵活的网络服务。该方案不仅涵盖传统的通信连接&#xff0c;更是深入到能源…

复盘-excel

excel-选列没有用&#xff0c;选小标题才可以 将簇状柱形图放置在一个新表上##### excel: 添加数据模型时&#xff0c;要通过套用表格格式与外部断开连接 透视分析2010年人数未解决(第四套&#xff09; 通过日期显示星期几 判断星期几 因为前面已经通过星期六&#xff0c…

【AcWing】蓝桥杯集训每日一题Day1|二分|差分|503.借教室(C++)

503. 借教室 503. 借教室 - AcWing题库难度&#xff1a;简单时/空限制&#xff1a;1s / 128MB总通过数&#xff1a;8052总尝试数&#xff1a;26311来源&#xff1a;NOIP2012提高组算法标签二分差分 题目内容 在大学期间&#xff0c;经常需要租借教室。 大到院系举办活动&…