当前位置: 首页 > news >正文

【数据库概论】第十一章 数据库并发控制

第十一章 并发控制

在多处理机系统中,每个处理机可以运行一个事务,多个处理机可以同时运行多个事务,实现多个事务并行运行,这就是同时并发方式。当多个用户并发存取数据库时会产生多个事务同时存取同一事务的情况,如果对并发操作不加控制就可能破坏事务的一致性和数据库的一致性

11.1 并发控制概述

事务是并发控制的基本单位,保证食物的ACID特性是事务处理的重要任务。为了保证事务的隔离性和一致性,DBMS需要对并发操作进行正确的调度。

并发操作带来的数据不一致性包括以下几种情况:
1.丢失修改
两个事务T1和T2同时读入同一数据并修改,T2的提交结果破坏了T1的提交结果,导致T1修改被丢失。

2.不可重复读
不可重复读是指事务T1读取数据后,事务T2执行更新操作,使得T1无法再现前一次的读取结果。包含三种情况:

  1. 事务T1读取数据后,T2对其进行了修改,T1再次读数据的时候,得到了与前一次不同的值
  2. 事务T1按一定条件从数据库读取了数据记录后,T2删除了部分记录,当T1再次读数据的时候,发现某些数据消失了。
  3. 事务T1按一定条件从数据库读取某些数据之后,T2插入了一些记录,当T1再次按相同条件读取数据的时候,发现多了一些记录

后两种不可重复读被称为数据幻影现象

3.读脏数据
指事务T1修改某一数据并且写回磁盘,T2读取到该数据后,T1事务被撤销了,则T2中读到的数据是被撤销前的数据,为脏数据。

上述三类数据不一致的主要原因是并发操作破坏了事务的隔离性,并发机制就是要用正确的方式调度并发操作,使得一个用户事务的执行不受其他事务干扰,来避免数据的不一致性

主要控制技术有封锁、时间戳、乐观控制法和多版本并发控制,下面依次介绍这些方法。

11.2 封锁

封锁是实现并发控制的一个非常重要的技术。封锁指的是事务T在对某个数据对象进行操作之前,先请求系统对该对象进行加锁,仅当他完成操作后才允许其他事务对该对象进行操作。

基本的封锁类型有两种:排他锁(exclusive lock,简称X锁)和共享锁(share lock,简称S锁)。

排他锁又称为写锁,一般写操作使用,事务T给数据对象A加X锁后,不允许任何事物给A加锁和访问A,直到T释放A上的锁.

共享锁又称为读锁,如果事物T对对象A加上S锁。则该事务可以读但不可以修改A,而且其他事务只能对A加S锁而不能加X锁,直到所有的S锁释放。

11.3 封锁协议

在运用封锁的时候,还需要约定一些规矩,这些协议被称为封锁协议。对封锁方式制定不同的规则,就形成了各种不同的封锁协议。

1.一级封锁协议

一级封锁协议是指,事务T在修改数据R之前必须对其先加X锁,直到事务结束的时候才释放。事务结束包括COMMIT和ROLLBACK。一级封锁协议可防止丢失修改,并且保证事务T是可以恢复的。在一级封锁协议中, 仅仅是读数据而不修改,是不需要加锁的,因此不能保证可重复读,也不能保证不读脏数据。

2.二级封锁协议

二级封锁协议是指,在以及封锁协议基础上增下了事务T在读取数据R前必须先对其加上S锁,读完后方可释放。
二级封锁协议可以防止丢失修改,并且进一步防止读取脏数据。

3.三级封锁协议
三级封锁协议是指,在以及封锁协议上增加了事务T在读取数据R之前必须先对其加上S锁,直到事务结束才释放

该跟锁协议出了防止丢失修改和读取脏数据外,还进一步防止了不可重复读。

上述封锁协议主要区别在于什么操作需要申请封锁,以及何时释放锁。

11.4 活锁和死锁

活锁

如果事务T1封锁了数据R,事务T2又请求封锁R,于是T2开始等待;如果此时T3也请求封锁R,那么当T1释放了R上的封锁后会首先通过T3的封锁请求,如果后面还有源源不断的事务请求的话,T2会陷入持续忙等的情况,但是忙等的情况还是有机会解除的,这就说活锁

避免活锁的简单方法是采用先来先服务策略。

死锁

如果T1封锁R1,T2封锁了R2,此时T1申请封锁R2,而T2又申请封锁R1。此时就会导致死锁——两个事务互相需要彼此的资源,但是两者都不释放锁。这就类似于两个人互相持枪对峙,然后两边都要求对方先放下枪。

目前数据库中解决死锁主要有两类方法,一类是预防死锁的发生,一类是采用一定手段解除死锁。

1.死锁的预防

  • 一次死锁法:要求每一个事务必须一次将所有的数据全部加锁,否则不能执行。这能够有效防止死锁的发生,但是由于扩大了封锁范围,降低了系统的并发度。第二,在动态运行时,一些数据原先不需要封锁的也可能变为要封锁的对象,事先难以精确确定每个事务要封锁的数据对象。也就是该法对于编译锁支持较好,但是对于动态运行时锁就有点无能为力了。
  • 顺序封锁法:顺序封锁法是预先对数据对象规定一个封锁顺序,所有事务都按照该顺序实施封锁。比如B树索引中,可以从根节点开始,逐步封锁下一层的节点。该法可以很有效地防止死锁,但是数据库中封锁的对象极多,要维护这样的资源的封锁顺序成本极高。而且事务的封锁请求会随着事物的执行而动态变化。

可见,在操作系统中普遍采用的死锁预防并不太适合数据库,因此DBMS在解决死锁问题上主要采用诊断并解除死锁的方法。

2.死锁的诊断与解除

数据库系统中诊断死锁的方法与操作系统类似,一般使用超时法或者事物等待图法。

  1. 超时法
    如果一个事务等待时间显然超出了规定时限,则认为发生了死锁。该法很简单,但是可能会误判死锁,而且对超时时限的设置要求比较严格

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

一旦检测到系统中存在死锁,使用的方法是选择一个处理死锁代价最小的事务,将其撤销,释放此事务所有的锁,使得其他事务可以继续运行。

11.5 并发调度的可串行性

可串行化调度

多个事务正确地并发执行后的结果应该与按某一次序串行地执行这些事务时的结果相同
可串行性是并发事务正确调度的准则。

冲突操作指的是不同的事务对同一个数据的读写操作和写写操作。一个调度Sc在保证冲突操作的次序不变的情况下,通过交换两个事务的不冲突次序得到另外一个调度Sc‘,如果Sc’是串行的,则称Sc为冲突可串行化。如果一个调度是冲突可串行化的,则一定是可串行化调度。

冲突可串行化调度是可串行化调度的充分不必要条件

11.6 两段锁协议

为了保证并发调度的正确性,数据库管理系统的并发控制机制提供一定缩短来保证调度是可串行化的。目前普遍使用的是两段锁协议。

两段锁协议指所有事务必须分两个阶段对数据项进行加锁和解锁:

  • 对任何数据进行读写操作之前,首先申请并获得对该数据的封锁
  • 在释放一个封锁之后,事务不再申请和获得任何其他的封锁。

两段锁的含义是,事务分为两个阶段,第一阶段是获得封锁,这个阶段事务可以申请获得任何数据项上的任何类型的锁,但是不能释放任何锁。第二阶段是释放封锁,这个阶段,事务可以释放任何数据项上的任何封锁,但是不能申请任何锁。

事务遵循两段锁协议是可串行化调度的充分条件,而不是必要条件。

11.7 封锁的粒度

封锁对象的大小称为封锁粒度。封锁的对象可以是逻辑单元,比如属性值的集合、元组、关系、索引等,也可以是物理项,比如页、物理记录等。

封锁粒度与系统的并发度和并发控制的开销密切相关。封锁粒度越大,数据库能封锁的数据单元越少,并发度越低;反之则并发度较高,但是由于需要调度系统资源,频繁加锁解锁,系统开销大。

如果一个系统中同时支持多种封锁粒度提供不同事务选择是比较理想的,这种封锁方法称为多粒度封锁

多粒度封锁

讨论多粒度封锁首先需要定义多粒度树。多粒度树的根节点是整个数据库,表示最大的数据粒度,叶节点表示最小的封锁粒度。比如如下一棵三级粒度树:
在这里插入图片描述

多粒度封锁协议允许多粒度树中每个节点被独立地加锁。对一个节点加锁代表着其后裔节点也被加以同样的锁。

因此,显示封锁指的是事务直接为数据对象加锁;隐式封锁是该数据对象没有被独立加锁,是由于其上级节点加锁而使得该数据对象加上了锁。

一般对某个数据对象加锁,系统除了要检查数据对象时有无显式封锁,还需要检查其上级节点有无被封锁,以及其所有子树节点。这样检查的效率很低,因此人们引进了一种新型锁——意向锁

意向锁

意向锁的含义是如果对一个节点加了意向锁,说明该节点的下层节点正在被封锁;对任意节点加锁时,必须先对他的上层节点加意向锁。

比如对任意元组加锁的时候,必须先对它所在的数据库和关系加意向锁。下面介绍三种常见意向锁:
在这里插入图片描述

11.8 其他并发控制机制

并发控制的方法出了封锁技术外还有时间戳方法、乐观控制法和多版本并发控制等。时间戳方法是给每一个事务盖上一个时标,并按照这个时间戳来解决事务的冲突操作

多版本并发控制

版本是指数据库中数据对象的一个快照,记录了数据对戏那个某个时刻的状态。

多版本并发控制和封锁机制相比,主要的好处是消除了数据库中数据对象的读和写操作的冲突,提高了系统性能。

相关文章:

【数据库概论】第十一章 数据库并发控制

第十一章 并发控制 在多处理机系统中,每个处理机可以运行一个事务,多个处理机可以同时运行多个事务,实现多个事务并行运行,这就是同时并发方式。当多个用户并发存取数据库时会产生多个事务同时存取同一事务的情况,如果…...

Nginx配置实例-反向代理案例二

实现效果:使用nginx反向代理,根据访问的路径跳转到不同端口服务 nginx监听端口为9000, 访问 http://127.0.0.1:9000/edu/ 直接跳转到127.0.0.1:8080 访问 http://127.0.0.1:9000/vod/ 直接跳转到127.0.0.1:8081 一、准备工作 1. 准备两个tom…...

HTML 字符集

为了正确显示 HTML 页面,Web 浏览器必须知道要使用哪个字符集。 从 ASCII 到 UTF-8 ASCII 是第一个字符编码标准。ASCII 定义了 128 种可以在互联网上使用的字符:数字(0-9)、英文字母(A-Z)和一些特殊字符…...

【C语言】每日刷题 —— 牛客语法篇(3)

前言 大家好,继续更新专栏c_牛客,不出意外的话每天更新十道题,难度也是从易到难,自己复习的同时也希望能帮助到大家,题目答案会根据我所学到的知识提供最优解。 🏡个人主页:悲伤的猪大肠9的博客…...

基于Vue3和element-plus实现一个完整的登录功能

先看一下最终要实现的效果:登录页面:注册页面:(1)引入element-plus组件库引入组件库的方式有好多种,在这里我就在main.js全局引入了.npm i element-plus -Smain.js中代码:import { createApp } from "vue"; //element-plus import ElementPlus from "element-pl…...

【java】Java 中泛型的实现原理

文章目录前序1. 泛型1.1 泛型方法1.2 泛型类1.3 泛型接口2. 泛型的基本原理3. 小结前序 泛型是 Java 开发中常用的技术,了解泛型的几种形式和实现泛型的基本原理,有助于写出更优质的代码。本文总结了 Java 泛型的三种形式以及泛型实现原理。 1. 泛型 …...

【C++提高编程】C++全栈体系(二十七)

C提高编程 第五章 STL- 常用算法 三、常用排序算法 算法简介: sort //对容器内元素进行排序random_shuffle //洗牌 指定范围内的元素随机调整次序merge // 容器元素合并,并存储到另一容器中reverse // 反转指定范围的元素 1. sort 功能描述&#…...

软考高级信息系统项目管理师系列之三十九:项目集管理

软考高级信息系统项目管理师系列之三十九:项目集管理 一、项目集管理内容二、项目集管理基础概述1.项目集定义2.项目集活动3.项目集管理三、项目集的管理过程四、项目集治理1.项目集治理概述2.项目集指导委员会的职责3.项目集治理功能五、项目集生命周期1.项目集生命周期三个阶…...

44-Golang中的channel

Golang中的channel为什么要使用channelchannel的介绍channel的基本使用定义/声明channel管道的遍历和关闭channel的关闭channel的遍历goroutine和channel结合应用实例1应用实例2案例注意事项为什么要使用channel 前面使用全局变量加锁同步来解决goroutine的通讯,但…...

80/20法则

80/20法则(The 80/20 Rule)又称为帕累托法则(Pareto Principle)、二八定律、帕累托定律、最省力法则、不平衡原则、犹太法则、马特莱法则等一、什么是80/20法则80/20法则(The 80/20 Rule),又称为帕累托法则…...

计算机网络高频面试题(四)

一、什么是计算机网络 是一个将分散的、具有独立功能的计算机系统,通过通信设备与线路连接起来,由功能完善的软件实现资源共享和信息传递的系统 按分布范围,计算机网络里有局域网LAN和广域网WAN, 其中局域网的代表以太网,以及这…...

[计算机组成原理(唐朔飞 第2版)]第三章 系统总线(学习复习笔记)

3.1 总线的基本概念 计算机系统的五大部件之间的互连方式有两种 各部件之间使用单独的连线,称为分散连接将各部件连到一组公共信息传输线上,称为总线连接 总线是连接多个部件的信息传输线,是各部件共享的传输介质。 当多个部件与总线相连时&…...

华为OD机试题 - 计算堆栈中的剩余数字(JavaScript)| 机考必刷

更多题库,搜索引擎搜 梦想橡皮擦华为OD 👑👑👑 更多华为OD题库,搜 梦想橡皮擦 华为OD 👑👑👑 更多华为机考题库,搜 梦想橡皮擦华为OD 👑👑👑 华为OD机试题 最近更新的博客使用说明本篇题解:计算堆栈中的剩余数字题目输入输出描述示例一输入输出说明示例二…...

VB实现点爆炸效果

需在窗体放置以下 4 个控件,所有控件不用设置任何属性,均采用默认设置: ’ Picture1,Command1,Check1,Timer1 Option Explicit Dim I Dim ctD() As tyD, ctDs As Long, ctR As Single Private Type tyD x…...

ICG-alkyne,吲哚菁绿-炔基结构式,实验室科研试剂,CAS号:1622335-41-4

ICG-alkyne,吲哚菁绿-炔基 中文名称:吲哚菁绿-炔基 CAS号:1622335-41-4 英文名称:ICG-alkyne 英文别名:ICG-alk 性状:绿色粉末 化学式:C48H53N3O4S 分子量:768.03 溶剂:溶于…...

【并发编程】volatile的原理我好像又懂了

文章目录优秀引用1、概述2、可见性保证2.1、什么是可见性2.2、例子举证2.3、结果解析3、有序性保证3.1、什么是有序性3.2、什么是重排序3.3、例子举证4、无法保证原子性4.1、什么是原子性4.2、例子举证5、内存屏障5.1、什么是内存屏障5.2、不同内存屏障的作用6、volatile和sync…...

【已更新实例】Java网络爬虫-HttpClient工具类

关于用Java进行爬虫的资料网上实在少之又少,但作为以一名对Java刚刚初窥门径建立好兴趣的学生怎么能静得下心用新学的Python去写,毕竟Java是世界上最好的语言嘛 (狗头)关于Java爬虫最受欢迎的一个框架Jsoup常常搭配HttpClient来使用,因为Jsou…...

7.2 向量的坐标

🙌作者简介:数学与计算机科学学院出身、在职高校高等数学专任教师,分享学习经验、生活、 努力成为像代码一样有逻辑的人! 🌙个人主页:阿芒的主页 ⭐ 高等数学专栏介绍:本专栏系统地梳理高等数学…...

公式编写1000问21-22

21.问: 求助——(周,日,60分钟,30分钟)MACD同时向上的公式怎么表达 答(知无不言): z:“macd.dea#week”; r:“macd.dea#day”; f:“macd.dea#min60”; f1:“macd.dea#min30”; rz:“macd.dea##week”; rr:“macd.dea##day”; rf:“…...

1041 考试座位号

每个 PAT 考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位。正常情况下,考生在入场时先得到试机座位号码,入座进入试机状态后,系统会显示该考生的考试座位号码,考试时考生需要换到考试…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...