数据库系统-并发控制
文章目录
- 一、为什么要并发控制
- 1.2 并发控制解决的问题
- 1.2.1 脏读
- 1.2.2 幻读
- 1.2.3 不可重复读
- 1.2.4 数据丢失问题
- 二、事务调度及可串行性
- 2.1 事务
- 2.1.1 事务的宏观
- 2.1.2 事务的微观
- 2.1.3 事务的特性 ACID
- 2.2 事务调度与可串行性
- 2.3 冲突可串行化判定
- 三、基于封锁的并发控制方法
- 3.1 锁的类型
- 3.1.1 共享锁Shared Lock
- 3.1.2 排它锁Exclusive Lock
- 3.1.3 意向共享锁 Intent Shared Lock
- 3.1.4 意向排他锁 Intent Exclusive Lock
- 3.1.5 更新锁Update Lock
- 3.1.6 增量锁Incremental Lock
- 3.1.7 行级锁Row Lock
- 3.1.8 表级锁Row Lock
- 3.1.9 锁的优先级
- 3.2 加锁解锁时机
- 3.3 SQL隔离级别
- 3.3.1 读未提交 read uncommitted 0
- 3.3.2 读已提交 read committed 1
- 3.3.3 可重复读 repeatable read 2
- 3.3.4 可串行化 serializable 3
- 3.4 两段锁协议
- 四、基于时间戳的并发控制方法
- 4.1 基于时间戳顺序的调度规则
- 4.2 基于时间戳调度托马斯规则
- 五、基于有效性确认的并发控制方法
一、为什么要并发控制
多端操作同一个数据库的问题

1.2 并发控制解决的问题
1.2.1 脏读
新增的是行

1.2.2 幻读
修改的是原有数据的记录
1.2.3 不可重复读

1.2.4 数据丢失问题

并发控制、事务、封锁 是DBMS实现并发控制的核心技术

二、事务调度及可串行性
2.1 事务
DBMS提供的控制数据操作的一种手段,:应用程序员将一系列的数据库操作组合在一起为一个整体进行操作和控制,保证了一致性
2.1.1 事务的宏观
事务的宏观(应用程序员看到的事务):一个存取或改变数据库内容的程序的一次执行,或者说一个SQL组合的一次执行被看做一个事务。
由应用程序提出,有开始和结束,结束前需要提交或者撤销
Begin Transcationexec sql......exec sql...exec sql commit work | exec sql rollback work
End Transcation
一段程序语句中,可能会存在执行循环,SQL引出事务,到Commit/Rollback结束事务,每次重复执行都会产生一个事务

2.1.2 事务的微观
DBMS看到的事务:对数据库的一系列基本操作(读写)的一个整体性执行
事务的并发执行: 多个事务从宏观上看是并行执行的,但是微观上的基本操作(R、W)是可以交叉执行的
2.1.3 事务的特性 ACID

原子性Atomicity:一组SQL操作是不可再分的
一致性Consistency:事务开始和结束时,数据库的完整性约束都存在。比如:每个银行账户>0 , 事务执行前后都应该>0
隔离性Isolation:多个并发事务之间的操作应该是互不干扰,每个事务独立运行。
持久性:一旦提交,结果就应该永久保存在数据库中。及时出现故障也不能丢失数据

2.2 事务调度与可串行性
事务调度:一组事务的基本步骤(R\W\其他控制操作加锁解锁等)的一种执行顺序称为对这组事务的一个调度。
并发(并行)调度:多个事务从宏观上看上去是并行执行的,但是微观上的基本操作(RW)是可以交叉执行的

并发调度的正确性:多个事务并发执行结果 === 每个事物依次执行的结果
并发调度的可串行性:一个调度的影响 === 某几个串行调度相同,则说 可串行化的 或 具有可串行性

冲突:调度中一一对连续的动作,如果他们顺序交换,那么涉及的事务中必须要改变。
有冲突的两个操作是不能交换次序的,没有冲突的两个事物是可以交换的。

事务可串行化是指对于任何两个或多个事务,
如果它们并发执行的结果和以某个序列化的顺序执行的结果是一样的,
那么这些事务就是可串行化的。 冲突可串行化是指对于任何两个或多个事务,
如果它们并发执行的结果和以某个序列化的顺序执行的结果是一样的,
且它们之间任何一个数据项的读写操作之间都没有冲突,
那么这些事务就是冲突可串行化的。 可串行化和冲突可串行化的区别在于,
可串行化只是要求不同的事务在并发执行和串行执行的结果是一致的,
而冲突可串行化要求不同事务之间的数据访问顺序不能引起冲突。
2.3 冲突可串行化判定
- 构造前驱图(有向图)
- 节点是每一个事物T。如果Ti的一个操作和Tj的一个操作发生冲突,Ti在Tj前面,则绘制一条边,由Ti指向Tj
- 测试检查:如果此有向图没没有环,那么冲突就是可串行的

三、基于封锁的并发控制方法
锁 是控制并发的一种手段
- 每一数据元素都有唯一的锁
- 事务读写前,要获取锁
- 后面的事务需要等待锁释放
- 事务处理完成后需要释放锁




3.1 锁的类型
3.1.1 共享锁Shared Lock
多个事务可以一起用共享锁,只能读取,不能修改
当数据有了排它锁,就不能再加共享锁
3.1.2 排它锁Exclusive Lock
一个事务独占排它锁,可以修改
3.1.3 意向共享锁 Intent Shared Lock
辅助锁,用来表明想要加上共享锁
3.1.4 意向排他锁 Intent Exclusive Lock
辅助锁,用来表明想要加上排它锁
3.1.5 更新锁Update Lock
也称为 共享更新锁,是一种介于 共享锁&排它锁 之间的锁
允许多个事务读取资源,但只允许一个事务进行修改
同样的,只能有一个更新锁,有了 更行锁 就不能加 共享锁
3.1.6 增量锁Incremental Lock
增量的 对 数据进行 lock & unlock
从而减少了锁冲突的概率,提升了并发性能
通常用于高并发场景下的资源访问控制
3.1.7 行级锁Row Lock
只锁定一行行的数据,而不锁定表的数据
3.1.8 表级锁Row Lock
锁定整个表
3.1.9 锁的优先级
排它锁 > 意向排它锁 > 意向共享锁 > 共享锁
行级锁 > 表级锁
3.2 加锁解锁时机

3.3 SQL隔离级别
3.3.1 读未提交 read uncommitted 0
可以读取其他事务未提交的数据,也就是允许脏读
最低的隔离级别,并发性最高,但是会导致数据不一致问题
3.3.2 读已提交 read committed 1
只能读取已经提交的数据,避免了脏读
但是在并发,多个事务同时访问一个数据,可能会出现重复读取的数据
3.3.3 可重复读 repeatable read 2
读取前,先加锁,其他事务不能修改
避免了重复读和脏读
3.3.4 可串行化 serializable 3
RW都会加锁,完全避免了并发
性能下降

封锁的粒度:

属性值 —> 元祖 —> 元祖集合 —> 整个关系 —> 整个DB
索引项 —> 整个索引

3.4 两段锁协议
加锁阶段Growing Pahse & 解锁阶段Shrinking Phase
访问前先申请锁
在提交前,所有的锁都不能释放
在加锁阶段,任何事务不能访问已经加锁的资源
银行转账,双方账户都锁定,转账才开始

四、基于时间戳的并发控制方法
4.1 基于时间戳顺序的调度规则
基于时间戳顺序的调度规则是根据事务提交的时间戳顺序进行调度,即按照时间戳先后顺序来决定事务执行的顺序

时间戳相同,就会导致死锁
此外,如果有多个事务同时竞争多个数据项,并且它们的时间戳相互依存,那么就可能出现死锁的情况。例如,如果事务1需要修改数据项A和B,而事务2需要修改数据项B和C,而时间戳1 < 时间戳2,那么事务1会先获得A和B的锁,但是无法获得C的锁,而事务2会先获得C的锁,但是无法获得B的锁,从而导致死锁的情况。
4.2 基于时间戳调度托马斯规则
托马斯规则要求事务按照它们的时间戳顺序提交,如果一个事务想要提交,但是有其他事务正在等待或已经占据它要修改的数据项,那么它必须等待所有占据该数据项的其他事务都提交或回滚后才能提交。托马斯规则的核心思想是通过强制事务按照一定的顺序提交,来保证不会出现死锁的情况。

五、基于有效性确认的并发控制方法
事务操作数据前,先确认没有其他事务正在操作
基于有效性确认的并发控制方法可以保证数据库的一致性和完整性,但它也会带来一定的性能开销,因为需要对每个事务所涉及到的数据项进行确认。此外,如果事务之间的竞争比较激烈,那么可能会导致较高的并发冲突率,影响系统的响应时间和处理能力。因此,在实际应用中,需要综合考虑并发控制方法的安全性和效率,选择合适的方法来满足系统的需求。
相关文章:
数据库系统-并发控制
文章目录 一、为什么要并发控制1.2 并发控制解决的问题1.2.1 脏读1.2.2 幻读1.2.3 不可重复读1.2.4 数据丢失问题 二、事务调度及可串行性2.1 事务2.1.1 事务的宏观2.1.2 事务的微观2.1.3 事务的特性 ACID 2.2 事务调度与可串行性2.3 冲突可串行化判定 三、基于封锁的并发控制方…...
Java8 教程_编程入门自学教程_菜鸟教程-免费教程分享
教程简介 Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本。 Java 8 是oracle公司于2014年3月发布,可以看成是自Java 5 以来最具革命性的版本。Java 8为Java语言、编译器、类库、开发工具与JVM带来了大量新特性。 Java 8入门教程 - 从简单的步骤了解Java…...
从零开始学架构——高可用存储架构
双机架构 存储高可用方案的本质都是通过将数据复制到多个存储设备,通过数据冗余的方式来实现高可用,其复杂性主要体现在如何应对复制延迟和中断导致的数据不一致问题。因此,对任何一个高可用存储方案,我们需要从以下几个方面去进…...
连ChatGPT都不懂的五一调休,到底怎么来的?
今天是周几? 你上了几天班了? 还要上几天班放假? 五一啥安排? 出行的票抢到了吗? 调休到底是谁发明的?! 五一劳动节是要劳动吗? 为什么昨天是周一,今天还是周一&a…...
AES工作流程
工作流程 模式 1:加密 ⚫ 复位EN 重置AES模块 ⚫ 设置模式寄存器mode[1:0]00,设置流数据处理模式寄存器CHMOD[1:0] ⚫ 写AES_KEYRx寄存器,CTR和CBC模式下写AES_IVRx寄存器 ⚫ 写EN1,使能AES ⚫ 写AES_DINR 寄存器4次 ⚫ 等待CCF标…...
C++11
C11 统一的列表初始化 在介绍这里的列表初始化之前,首先我认为这是一个比较鸡肋的功能特性,而且使用起来会和之前C98时有些区别。 // 首先可以定义普通的内置类型的变量int x1 1;int x2 { 1 };int x3{ 1 }; // 这样看起来着实有些怪int arry1[] { 1,…...
ubuntu18.04 配置zlmediakit 支持ffmpeg转码记录
1、zlmediakt 默认不支持ffmepg转码,需要在根目录下的CamkeLists.txt里面option(ENABLE_FFMPEG "Enable FFmpeg" OFF) 将OFF改成ON, 删除原有的build目录,sudo mkdir build. cd build,cmake .. 这样在编译生成文件夹release/linux/debug/生…...
H68K配置路由功能
系统环境Armbian ubuntu系统 参考 如何使用Debian/Ubuntu等Linux做软路由(物理机版本,非虚拟机容器版) - 知乎 https://zhuanlan.zhihu.com/p/587068225 按照他操作的结果,就是只有一个网卡正常 最后一顿操作就出现了我这么个配置 更新源…...
*2.5 迭代法的收敛阶与加速收敛方法
学习目标: 了解迭代法的基本概念和原理。学习者需要理解迭代法的基本概念和原理,包括迭代过程、迭代格式、收敛性等基本概念。 熟练掌握迭代法的收敛阶和收敛速度。学习者需要了解迭代法的收敛阶和收敛速度,掌握如何计算迭代法的收敛阶和收敛…...
仪表板展示 | X-lab开放实验室GitHub开源项目洞察大屏
背景介绍 X-lab开放实验室是一个开源软件产业开放式创新的共同体,由来自国内外著名高校、创业公司、部分互联网与IT企业的专家学者与工程师所构成,目前已在包括开源治理标准制定、开源社区行为度量与分析、开源社区流程自动化、开源全域数据治理与洞察等…...
【c语言】五大内存区域 | 堆区详解
创作不易,本篇文章如果帮助到了你,还请点赞支持一下♡>𖥦<)!! 主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步! 给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ…...
【JavaScript】动态表格
🎊专栏【 前端易错合集】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【如愿】 大一同学小吉,欢迎并且感谢大家指出我的问题🥰 🍔介绍 就是在输入框中输入数字后,再按…...
Css如何优雅的实现抽奖转盘
如图,抽奖转盘,可以拆分为几部分: 1.底部大圆; 2.中间小圆; 3.扇形区; 4.扇形内部奖品区; 5.抽奖按钮; 6.点击抽奖按钮时旋转动效及逻辑; 这其中,扇形区&am…...
在Java的小问题
问题1:如何在Java中创建一个对象? 解决方法: 在Java中,要创建一个对象,需要以下步骤: 创建一个类,定义对象的属性和行为。在类中定义一个构造函数,用于初始化对象的属性。在程序中…...
HashMap的扩容机制、初始化容量大小的选择、容量为什么是2的次幂
前置知识 先来看看HashMap中的成员属性 解释: size当前的容器中Entry的数量,也就是当前K-V的数量loadFactory装载因子,用来衡量HashMap满的程度,loadFactory的默认值是0.75threshold临界值,当实际KV数量超过threshol…...
[jenkins自动化2]: linux自动化部署方式之流水线(下篇)
目录 1. 引言: 2. 进阶操作 流水线 -> 2.1 简介: -> 2.2 最终效果图展示: -> 2.3 有没有心动, 真的像流水线一样, 实现了一键部署启动 3. 实现方式 3.1 下载几个插件 3.2 创建流水线任务 3.3 点击配置 3.4 根据流水线语法 写一个简单的helloworld 3.5 执行…...
idea使用 ( 二 ) 创建java项目
3.创建java项目 3.1.创建普通java项目 3.1.1.打开创建向导 接 2.3.1.创建新的项目 也可以 从菜单选择建立项目 会打开下面的选择界面 3.1.2.不使用模板 3.1.3.设置项目名 Project name : 项目名 Project location : 项目存放的位置 确认创建 3.1.4.关闭tips 将 Dont s…...
RabbitMq-接收消息+redis消费者重复接收
在接触RammitMQ时,好多文章都说在配置中设置属性 # rabbitmq 配置 rabbitmq:host: xxx.xxx.xxx.xxxport: xxxxusername: xxxpassword: xxxxxx## 生产端配置# 开启发布确认,就是confirm模式. 消费端ack应答后,才将消息从队列中删除#确认消息已发送到队列(Queue)pub…...
Orangepi Zero2 全志H616简介
为什么学 学习目标依然是Linux 系统 ,平台是 ARM 架构 蜂巢快递柜,配送机器人,这些应用场景用C51,STM32单片机无法实现 第三方介入库的局限性,比如刷脸支付和公交车收费设备需要集成支付宝SDK,提供的libalipay.so 是…...
Golang每日一练(leetDay0047)
目录 138. 复制带随机指针的链表 Copy List with Random-pointer 🌟🌟 139. 单词拆分 Word Break 🌟🌟 140. 单词拆分 II Word Break II 🌟🌟🌟 🌟 每日一练刷题专栏 &…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...
