数据库系统-并发控制
文章目录
- 一、为什么要并发控制
- 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 🌟🌟🌟 🌟 每日一练刷题专栏 &…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...
uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...
