数据库系统--并发控制

news2024/11/16 12:07:05

文章目录

  • 一、为什么要并发控制
    • 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 两段锁协议
  • 四、基于时间戳的并发控制方法
  • 五、基于有效性确认的并发控制方法

一、为什么要并发控制

多端操作同一个数据库的问题
在这里插入图片描述

1.2 并发控制解决的问题

1.2.1 脏读

新增的是行
在这里插入图片描述

1.2.2 幻读

修改的是原有数据的记录在这里插入图片描述

1.2.3 不可重复读

在这里插入图片描述

1.2.4 数据丢失问题

在这里插入图片描述
并发控制、事务、封锁 是DBMS实现并发控制的核心技术
在这里插入图片描述

二、事务调度及可串行性

2.1 事务

DBMS提供的控制数据操作的一种手段,:应用程序员将一系列的数据库操作组合在一起为一个整体进行操作和控制,保证了一致性

2.1.1 事务的宏观

事务的宏观(应用程序员看到的事务):一个存取或改变数据库内容的程序的一次执行,或者说一个SQL组合的一次执行被看做一个事务。
由应用程序提出,有开始和结束,结束前需要提交或者撤销

Begin Transcation
	exec 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 冲突可串行化判定

  1. 构造前驱图(有向图)
  2. 节点是每一个事物T。如果Ti的一个操作和Tj的一个操作发生冲突,Ti在Tj前面,则绘制一条边,由Ti指向Tj
  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

增量的 对 数据进行 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
访问前先申请锁
在提交前,所有的锁都不能释放
在加锁阶段,任何事务不能访问已经加锁的资源

银行转账,双方账户都锁定,转账才开始

四、基于时间戳的并发控制方法

五、基于有效性确认的并发控制方法

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

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

相关文章

【MySQL高级】——存储引擎

一、查看存储引擎 show engines;二、设置系统默认的存储引擎 <1> 查看默认的存储引擎 show variables like %storage_engine%; #或 SELECT default_storage_engine;<2> 修改默认的存储引擎 1. 命令方式 SET DEFAULT_STORAGE_ENGINEMyISAM;2. 配置文件方式 …

研读Rust圣经解析——Rust learn-13(并发)

研读Rust圣经解析——Rust learn-13&#xff08;并发&#xff09; 并发创建新线程使用 join 等待所有线程结束线程获取环境所有权通过消息传递传送数据创建通道发送|接收消息隐式调用recv 共享状态并发通过使用互斥器Mutex创建Mutex共享MutexArc<T>原子引用计数 使用 Syn…

top命令学习

文章目录 一、top命令回显信息含义1、第一行2、第二行3、第三行4、第四行5、第五行6、第六行进程信息 二、top简单交互1、按数字“1”&#xff0c;显示列出所有cpu的信息2、按“M”&#xff0c;按内存使用率从大到小排序3、按“P”&#xff0c;按CPU使用率从大到小排序 一、top…

深度学习基础知识-感知机+神经网络的学习

参考书籍&#xff1a;&#xff08;找不到资源可以后台私信我&#xff09; 《深度学习入门&#xff1a;基于Python的理论与实现 (斋藤康毅)》 《Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow, 2nd Edition (Aurelien Geron [Gron, Aurlien])》 机器学习…

(转)mysql数据库安装指南

如果你的电脑是mac&#xff0c;参考社群会员 奔跑的土豆 的分享&#xff1a; https://http://zhuanlan.zhihu.com/p/37942063232 赞同 162 评论文章 如果你的电脑是windows&#xff0c;参考下面的安装步骤。 一、下载mysql数据库 进入MySQL官方网站&#xff08;MySQL Co…

ARM Cortex-R52 通用中断控制器GIC:Generic Interrupt Controller(一)

ARM Cortex-R52 GIC:Generic Interrupt Controller 前言&#xff1a;名词解释 英文缩写英文全称&#xff08;中文释义&#xff09;GICgeneral interrupt controllerITSInterrupt Translation Service:用来解析中断SPIShared Peripheral InterruptsPPIPrivate peripheral inte…

BM40-重建二叉树

题目 给定节点数为 n 的二叉树的前序遍历和中序遍历结果&#xff0c;请重建出该二叉树并返回它的头结点。 例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6}&#xff0c;则重建出如下图所示。 提示: 1.vin.length pre.length 2.pre 和 vin 均无重复…

超算云服务深度学习环境配置及使用方法

目录 一、环境配置 1. 通过SSH连接服务器 2. 查看服务器已安装模块 3. 调用Anaconda模块 4. 创建Python3.7的虚拟环境&#xff08;不是必须。不需要的话可以使用默认安装的环境&#xff09; 5. 虚拟环境下安装CUDA11.6Pytorch1.12.1 二、使用方法 1、提交作业 2、其他…

CKA证书模拟考试24道题

CKA证书模拟24道题-题解 快捷别名 alias kkubectl # will already be pre-configured export do"--dry-runclient -o yaml" # k create deploy nginx --imagenginx $do export now"--force --grace-period 0" # k delete p…

FPGA学习_01_基础知识(有点劝退,心灵弱小者勿入)

有些人喜欢直接拿开发板看教程开干&#xff0c;我认为了解点历史发展没什么坏处&#xff0c;一些FPGA的基础知识也是同样重要的。 1.1. FPGA的主要厂商 XILINX 占据FPGA绝大部分的市场份额 ALTERA 被 INTEL 167亿美元收购 改名为INTEL LATTICE 被神秘的中国公…

成就客户 | 企业如何培养“数据文化”?Smartbi教你3个步骤

随着数字化浪潮的发展&#xff0c;越来越多企业在实际工作中通过采用BI等各种数据处理工具提升工作效率。诚然&#xff0c;BI 工具可以帮助员工更好地理解和分析数据&#xff0c;从而发现业务中的机遇和挑战&#xff0c;然而如果仅仅只是提供工具和技术&#xff0c;而不重视培养…

浅谈“孔乙己的长衫“是脱不下来还是难脱下?

名人说&#xff1a;往者不可谏&#xff0c;来者犹可追。——《论语微子篇》 创作者&#xff1a;Code_流苏(CSDN) ★温馨提示&#xff1a;以下仅代表个人观点&#xff0c;不代表其它任何人看法。 目录 〇、缘由一、社会对于学历和职业之间的关系认知是怎样的&#xff1f;二、学…

密歇根大学Python系列之二:Python 编程进阶

Python如今无疑是全球最受欢迎的编程语言。它最大的好处&#xff0c;就是让越来越多的人通过它加入了编程的世界。学习Python是个好主意。无论你是一个初学者还是C或Java专家&#xff0c;都无需担心其派不上用场。 Paul Resnick 教授是密歇根大学迈克尔科恩学院的信息学教授&a…

解决软件项目冲突的5个重点

1、针对人员冲突管理 信任和沟通是解决人员冲突的关键。常见的人员冲突多表现为不信任和沟通不畅。 企业高层需要对项目经理充分信任和授权&#xff0c;以充分发挥项目经理的能力。项目经理对项目至关重要&#xff0c;如果项目经理频繁换人&#xff0c;高层领导变动&#xff0c…

云原生-k8s核心概念(pod,deploy,service,ingress,configmap,volume)

Gitee-k8s学习 云原生实战-kubernetes核心实战 namespace Namespace是kubernetes系统中的一种非常重要资源&#xff0c;它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离 Pod Pod可以认为是容器的封装&#xff0c;一个Pod中可以存在一个或者多个容器。 De…

C#开发的OpenRA的游戏用户的添加

C#开发的OpenRA的游戏用户的添加 OpenRA游戏前面在游戏开始的按钮的界面, 可以看到可以添加游戏用户,小规模战斗的界在,就是默认两个用户, 一个是玩家,一个是电脑的AI, 如果感觉少了,可以添加多几个电脑AI,这样做也是可以的。 不过在代码里是怎么样实现添加用户的呢…

word表格

新建&#xff08;修改&#xff09;“表格”样式 新建和修改样式的设置差不多&#xff0c;这里放在一起介绍 设置样式时&#xff0c;注意按图中的步骤设置&#xff0c;以免导致格式的应用出错&#xff0c;这里分四步&#xff1a; 格式应用于 “整个表格”&#xff1a;“字体”…

启英泰伦智能语音芯片在语音控制吸顶灯上的应用解决方案

随着智能控制技术的不断发展&#xff0c;人们对于家用电器的功能需求越来越多&#xff0c;智能吸顶灯是一种常见的照明设备&#xff0c;通常被安装在室内房顶上面&#xff0c;除了具有传统吸顶灯的照明功能外&#xff0c;还添加了智能控制和自动化功能&#xff0c;如远程控制、…

python Import Error: cannot import name SystemRandom

目录 一、前言二、解决方法三、改名之后带来的问题解决四、总结 一、前言 今天运行项目里面的文件&#xff0c;发现我简单的调试都不行&#xff0c;导入包就是不行&#xff0c;但是我新建一个窗口&#xff0c;把运行文件复制到另一个目录下就可以&#xff0c;就很奇怪。 报错信…

速卖通正式推出全托管,卖家竞争进入新阶段

全托管来了&#xff0c;卖家就能安心做甩手掌柜吗&#xff1f; 正式推出全托管 显而易见&#xff0c;越来越多的平台正在转向全托管模式。 近日&#xff0c;速卖通在2023年度商家峰会上&#xff0c;正式推出了全托管服务模式。官方表示&#xff0c;托管是对速卖通平台商家服…