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

前言

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

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


数据库系统概论系列文章传送门:
第一章 绪论
第二/三章 关系数据库和标准语言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,不同年份的练练手,套路都是一样的。

总结

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据分析-Pandas数据画箱线图

数据分析-Pandas数据画箱线图 数据分析和处理中,难免会遇到各种数据,那么数据呈现怎样的规律呢?不管金融数据,风控数据,营销数据等等,莫不如此。如何通过图示展示数据的规律? 数据表&#xff…

【重新定义matlab强大系列十七】Matlab深入浅出长短期记忆神经网络LSTM

🔗 运行环境:Matlab 🚩 撰写作者:左手の明天 🥇 精选专栏:《python》 🔥 推荐专栏:《算法研究》 #### 防伪水印——左手の明天 #### 💗 大家好🤗&#x1f91…

编程笔记 html5cssjs 005 小学数学四则运算练习

编程笔记 html5&css&js 005 小学数学四则运算练习 一、代码二、解释 这段代码定义了一个页面&#xff0c;用于小学数学四则运算的练习。这可能有点难&#xff0c;实际如果需要可以通过更改代码来达到要求。 一、代码 <!DOCTYPE html> <html lang"zh&quo…

Git是一个分布式版本控制系统 一.1

git补充 通过git clone命令还是直接下载ZIP文件&#xff0c;你获取的都是代码库中的源代码。这意味着你可以查看、修改和编译这些源代码&#xff0c;根据需要进行自定义和扩展。 需要获取源代码而不需要版本控制的情况来说&#xff0c;直接下载ZIP文件和使用git clone命令确实…

音视频学习笔记——c++多线程(二)

✊✊✊&#x1f308;大家好&#xff01;本篇文章是多线程系列第二篇文章&#x1f607;。首先讲解了利用mutex解决多线程数据共享问题&#xff0c;举例更好理解lock和unlock的使用方法&#xff0c;以及错误操作造成的死锁问题&#xff0c;最后讲解了lock_guard与unique_lock使用…

Django模型层(附带test环境)

Django模型层(附带test环境) 目录 Django模型层(附带test环境)连接数据库Django ORM在models.py中建表允许为空指定默认值数据库迁移命令 开启测试环境建表语句补充(更改默认表名)数据的增加时间数据的时区 多表数据的增加一对多多对多 数据的删除修改数据查询数据查询所有数据…

Linux unset命令教程:如何删除环境变量或函数(附实例详解和注意事项)

Linux unset命令介绍 unset命令用于删除环境变量或函数。如果你不再需要某个环境变量或函数&#xff0c;你可以使用unset命令将其删除。 Linux unset命令适用的Linux版本 unset命令在大多数Linux发行版中都是可用的&#xff0c;包括Debian、Ubuntu、Alpine、Arch Linux、Kal…

鸿蒙OpenHarmony HDF 驱动开发

目录 序一、概述二、HDF驱动框架三、驱动程序四、驱动配置坚持就有收获 序 最近忙于适配OpenHarmonyOS LiteOS-M 平台&#xff0c;已经成功实践适配平台GD32F407、STM32F407、STM32G474板卡&#xff0c;LiteOS适配已经算是有实际经验了。 但是&#xff0c;鸿蒙代码学习进度慢下…

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

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

基于机器学习的网络入侵检测二元分类模型构建与性能评估(NSL-KDD数据集)

简介 该项目是一个基于NSL-KDD数据集的网络入侵检测系统&#xff0c;主要采用机器学习方法对网络流量数据进行使用了多种机器学习模型&#xff0c;如逻辑回归、线性SVM、多项式核SVM、高斯核SVM、决策树、随机森林、朴素贝叶斯和K近邻算法训练二元分类&#xff08;正常/异常&a…

bug总结(1)--变量取错

a c t i v i t y [ ′ t a g n a m e ′ ] 应为 activity[tag_name]应为 activity[′tagn​ame′]应为couponActivitList[0][‘name’] .隐藏的bug&#xff0c;在测试中竟然测不出来&#xff0c;而且上线了好久。为啥会出现这种低级错误呢&#xff1f;第一是写的时候不够仔细认…

Day26:安全开发-PHP应用模版引用Smarty渲染MVC模型数据联动RCE安全

目录 新闻列表 自写模版引用 Smarty模版引用 代码RCE安全测试 思维导图 PHP知识点&#xff1a; 功能&#xff1a;新闻列表&#xff0c;会员中心&#xff0c;资源下载&#xff0c;留言版&#xff0c;后台模块&#xff0c;模版引用&#xff0c;框架开发等 技术&#xff1a;输…

Selenium库快速查找网页元素及执行浏览器模拟操作

Selenium 是一个自动化测试工具&#xff0c;主要用于模拟用户在网页上的行为&#xff0c;进行自动化测试。它支持多种浏览器&#xff0c;并且可以在多种操作系统上运行。以下是 Selenium 库的一些主要特点和用途&#xff1a; 网页自动化测试&#xff1a; Selenium 可以模拟用户…

2024 年中国高校大数据挑战赛赛题 C:用户对博物馆评论的情感分析完整思路以及源代码分享

博物馆是公共文化服务体系的重要组成部分。国家文物局发布&#xff0c; 2021 年我国新增备案博物馆 395 家&#xff0c;备案博物馆总数达 6183 家&#xff0c;排 名全球前列&#xff1b;5605 家博物馆实现免费开放&#xff0c;占比达 90%以上&#xff1b;全国 博物馆举办展览 3…

【深度学习笔记】6_5 RNN的pytorch实现

注&#xff1a;本文为《动手学深度学习》开源内容&#xff0c;部分标注了个人理解&#xff0c;仅为个人学习记录&#xff0c;无抄袭搬运意图 6.5 循环神经网络的简洁实现 本节将使用PyTorch来更简洁地实现基于循环神经网络的语言模型。首先&#xff0c;我们读取周杰伦专辑歌词…

Python操作Redis 各种数据类型

本文将深入探讨如何使用Python操作Redis&#xff0c;覆盖从基础数据类型到高级功能的广泛主题。无论是字符串、列表、散列、集合还是有序集合&#xff0c;我们将一一解析&#xff0c;同时提供丰富的代码示例帮助读者更好地理解和应用。除此之外&#xff0c;本文还将介绍Redis的…

JVM和JVM内存管理

Java虚拟机&#xff08;Java Virtual Machine 简称JVM&#xff09;是运行所有Java程序的抽象计算机&#xff0c;是Java语言的运行环境&#xff0c;它是Java 最具吸引力的特性之一。Java源代码经过编译器编译后生成与平台无关的字节码文件&#xff08;.class文件&#xff09;。当…

【20240309】WORD宏设置批量修改全部表格格式

WORD宏设置批量修改全部表格格式 引言1. 设置表格文字样式2. 设置表格边框样式3. 设置所有表格边框样式为075pt4. 删除行参考 引言 这两周已经彻底变为office工程师了&#xff0c;更准确一点应该是Word工程师&#xff0c;一篇文档动不动就成百上千页&#xff0c;表格图片也是上…

计算机视觉(CV)自然语言处理(NLP)大模型应用,如何实现小模型

在人工智能领域&#xff0c;大模型已经成为引领创新和进步的重要推动力。它们不仅在自然语言处理、计算机视觉等任务中展现了强大的性能&#xff0c;还为各行各业带来了前所未有的机遇和挑战。本文将从一个高级写作专家的角度&#xff0c;深入探讨大模型的现状、技术突破以及未…

STM32之串口中断接收UART_Start_Receive_IT

网上搜索了好多&#xff0c;都是说主函数增加UART_Receive_IT()函数来着&#xff0c;实际正确的是UART_Start_Receive_IT()函数。 —————————————————— 参考时间&#xff1a;2024年3月9日 Cube版本&#xff1a;STM32CubeMX 6.8.1版本 参考芯片&#xff1a…