数据库中的并发控制

并发操作带来的数据不一致性

1、并发控制:为了保证事务的隔离性和一致性,数据库管理系统需要对并发操作进行正确调度

并发控制的主要技术有:封锁、时间戳、乐观控制法、多版本并发控制等
并发操作带来的数据不一致性:
① 丟失修改:两个事务 T1 和 T2 读入同一数据并修改,T2 提交的结果破坏了 T1 提交的结果,导致T1的修改被丢失
② 不可重复读:指事务 T1 读取数据后,事务 T2 执行更新操作,使 T1 无法再现前一次读取结果
③ 读脏数据:事务 T1修改某一数据后并将其写回磁盘,事务 T2 读取同一数据后,T1 由于某种原因被撤销,这时T1 修改过的数据恢复原值,T2 读到的数据就与数据库中的数据不一致

2、并发控制的基本方法:封锁(X锁、S 锁)

① 排他锁/写锁,X锁
若事务T对数据对象 A加上X锁,则只允许事务T读取和修改 A
事务T释放 A 上的锁之前:其他事务不能读取和修改 A,不能再对 A 加任何类型的锁
② 共享锁/读锁,S 锁
若事务T对数据对象 A加上S锁,则事务T 可以读取 A,但不能修改 A
事务T释放A 上的S锁之前:其他事务可以读取 A,可以对A加S锁,但不能修改 A,也不能对A加X锁

在这里插入图片描述

3、封锁协议:约定何时申请X锁/S 锁、持续时间、何时释放等等

① 一级封锁协议
事务T在修改数据 R 之前必须先对其加 X锁,直到事务结束才释放
②二级封锁协议
事务 T 在修改数据 R 之前必须先对其加 X锁(一级封锁协议),并且其他事务在读取数据之前必须先对其加S锁,读完后即可释放 S锁
③三级封锁协议
事务 丅 在修改数据 R 之前必须先对其加 X锁(一级封锁协议),并且其他事务在读取数据之前必须先对其加S锁,直到事务结束才释放(二级封锁协议是读完就能释放)
不同级别的封锁协议和一致性保证:

在这里插入图片描述

封锁协议对一致性保证的原理

数据库中的封锁协议,通常分为一级封锁协议、二级封锁协议和三级封锁协议。它们用于控制并发事务之间的访问,确保数据库的一致性和隔离性。不同的封锁协议提供不同的保证,下面逐一解释这些协议如何影响事务的行为以及它们提供的保证。

一级封锁协议 (1PL, 一级封锁协议)

一级封锁协议要求事务在访问任何数据之前,对数据加上共享锁或排他锁。事务的锁会在操作过程中进行管理,直到事务结束时才会释放。一级封锁协议的特点是:

  • 不丢失修改:确保一个事务对数据的修改在事务提交之前不会被其他事务看到,因此可以避免丢失修改的问题。
  • 不能保证不读脏数据:由于该协议可能在事务执行过程中读取到其他未提交事务的数据,因此会存在脏读问题,即一个事务可能读到另一个事务未提交的修改。
  • 不能保证可重复读:由于可能读取到事务未提交的数据,因此在事务执行过程中,后续的读取操作可能会得到不同的结果,造成不可重复读问题。

示例:
1.事务1读取数据 X,然后事务2修改了 X,并提交。
2.事务1继续操作,但它的读取操作可能看到事务2未提交的数据。

这种协议在并发环境下可能导致数据不一致的问题。

二级封锁协议 (2PL, 二级封锁协议)

二级封锁协议要求每个事务在操作过程中,逐步释放所持有的锁,直到所有操作完成时才释放所有锁。这可以避免一个事务中途释放锁导致其他事务访问未提交的数据。

  • 不丢失修改:通过持有锁,确保一个事务对数据的修改在提交之前不会被其他事务干扰。
  • 不读脏数据:因为事务必须先获取锁才能读取数据,因此它不会读取到其他事务尚未提交的更改,从而避免了脏读。
  • 不能保证可重复读:即使事务持有锁并且不读脏数据,但如果在事务执行过程中,其他事务修改了数据并提交,那么事务中后续的读取操作也可能得到不同的结果,导致不可重复读的问题。

示例:
1.事务1获取了对数据 X 的锁,并开始读取数据。
2.事务2试图修改 X,但必须等到事务1释放锁才能操作。
3.事务1完成后释放锁,但事务2的修改可能会影响事务1后续读取的结果,从而出现不可重复读。

三级封锁协议 (3PL, 三级封锁协议)

三级封锁协议在二级封锁协议的基础上,进一步要求事务在访问数据时不仅要求加锁,而且要求对数据的锁必须满足“严格”的事务隔离策略,即加锁和解锁的顺序严格遵循一定规则,以避免“不可重复读”的情况。

  • 不丢失修改:由于严格的锁管理,保证事务提交之前的修改不会丢失。
  • 不读脏数据:因为事务必须持有锁并且不能提前释放,因此避免了读取其他事务未提交的数据。
  • 可重复读:通过在整个事务过程中保持锁的严格管理,事务在执行期间读取到的数据始终保持一致,确保了可重复读。

示例:
1.事务1获取数据 X 的锁,并开始读取数据。
2.事务2修改了 X,但事务1仍然保持对 X 的锁,直到事务1完成并提交。
3.事务1在整个过程中读取到的数据始终一致,无论其他事务是否对数据进行了修改。

三级封锁协议通过增加事务之间的锁定规则,保证了“可重复读”的特性,从而避免了事务间的不可重复读问题。

总结

在这里插入图片描述

小结:

  • 一级封锁协议:不丢失修改,但不能保证不读脏数据和可重复读。
  • 二级封锁协议:可以避免脏读,并且不丢失修改,但不能保证可重复读。
  • 三级封锁协议:可以保证不丢失修改、不读脏数据并且保证可重复读。

事务1获取数据 X 的锁,并开始读取数据。
事务2修改了 X,但事务1仍然保持对 X 的锁,直到事务1完成并提交。
事务1在整个过程中读取到的数据始终一致,无论其他事务是否对数据进行了修改。

在这个示例中,事务2是不是只有等事务1完成提交并释放共享锁之后,才能对数据X进行加排他锁然后再修改,否则一直无法修改数据X的值?

是的,在这个示例中,如果事务1保持对数据 X 的共享锁(通常是 共享锁(S锁)),事务2就不能立即对数据 X 加排他锁(排他锁(X锁))来进行修改,直到事务1完成并提交并释放共享锁为止。
详细解释:
1.事务1获取共享锁:

  • 当事务1对数据 X 加上共享锁(S锁)时,表示它只想读取数据而不进行修改。共享锁允许其他事务读取数据(即它们可以同时获取共享锁),但不允许其他事务对该数据进行修改。
  • 在事务1持有共享锁的期间,任何想要对数据 X 进行修改的事务(如事务2)都无法获取排他锁。

2.事务2尝试修改数据:

  • 事务2试图修改 X,这通常需要对 X 加排他锁(X锁)。排他锁会阻止其他事务(无论是读取还是写入)访问该数据。
  • 由于事务1持有共享锁,事务2无法获取排他锁,事务2必须等到事务1释放共享锁之后,才能获取排他锁并修改数据。

3.事务1提交并释放共享锁:

  • 事务1在完成操作后提交,并释放它对数据 X 的共享锁。
  • 一旦事务1释放共享锁,事务2就能够获取排他锁(X锁),并开始修改数据 X。

总结:
在事务1持有共享锁期间,事务2无法对数据 X 进行修改,因为它需要获取排他锁,而排他锁无法与共享锁并存。事务2只有等到事务1提交并释放共享锁之后,才能获取排他锁并修改数据 X。

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

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

相关文章

ArcGIS Server 10.2授权文件过期处理

新的一年,arcgis server授权过期了,服务发不不了。查看ecp授权文件,原来的授权日期就到2024.12.31日。好吧,这里直接给出处理方法。 ArcGIS 10.2安装时,有的破解文件中会有含一个这样的注册程序,没有的话&…

学英语学压测:02jmeter组件-测试计划和线程组ramp-up参数的作用

📢📢📢:先看关键单词,再看英文,最后看中文总结,再回头看一遍英文原文,效果更佳!! 关键词 Functional Testing功能测试[ˈfʌŋkʃənəl ˈtɛstɪŋ]Sample样…

MCGS学习记录

软件包 用户窗口 主窗口 元件:工具箱->输入框上面 数据对象 在工作台的实时数据库可以新增数据对象 理解为中间变量,控件改变其值,控件监测其值做出变化 基本属性 设定变量名和初始值 指针化? 变化时自动保存初始值&#x…

【网络协议】IPv4 地址分配 - 第一部分

文章目录 十进制与二进制网络如何被寻址地址类型网络地址广播地址主机地址 如何确定网络和主机部分的位数?网络中的主机数量与前缀号的关系计算每个前缀的主机数量公式 子网掩码二进制与操作(Binary ANDing)与操作(AND Operation&…

数据挖掘——集成学习

数据挖掘——集成学习 集成学习Bagging:有放回采样随机森林 BoostingStacking 集成学习 集成学习(Ensemble learning)方法通过组合多种学习算法来获得比单独使用任何一种算法更好的预测性能。 动机是为了提高但分类器的性能 Bagging&…

ansible-性能优化

一. 简述: 搞过运维自动化工具的人,肯定会发现很多运维伙伴们经常用saltstack和ansible做比较,单从执行效率上来说,ansible确实比不上saltstack(ansible使用的是ssh,salt使用的是zeromq消息队列[暂没深入了解]),但其实…

NLP CH10 问答系统复习

1. 专家系统 特点 问题聚焦:限定在特定领域。数据结构化:使用结构化的领域知识。数据库支持:后台有一个数据库,保存系统可提供的各种数据。查询机制:用户提问时,系统将问题转换为 SQL 查询语句&#xff0…

vite6+vue3+ts+prettier+eslint9配置前端项目(后台管理系统、移动端H5项目通用配置)

很多小伙伴苦于无法搭建一个规范的前端项目,导致后续开发不规范,今天给大家带来一个基于Vite6TypeScriptVue3ESlint9Prettier的搭建教程。 目录 一、基础配置1、初始化项目2、代码质量风格的统一2.1、配置prettier2.2、配置eslint2.3、配置typescript 3、…

【2025年最新】OpenWrt 更换国内源的指南(图形界面版)

在上一篇文章中我们讲解了如何使用命令行更换国内源,如果你没有终端工具,或者不喜欢命令行,那么图形界面方式将会是更简单有效的方式。 命令行版本:【2025年最新】OpenWrt 更换国内源的指南(命令行)-CSDN博客 为什么选择通过图形…

uni-app:实现普通选择器,时间选择器,日期选择器,多列选择器

效果 选择前效果 1、时间选择器 2、日期选择器 3、普通选择器 4、多列选择器 选择后效果 代码 <template><!-- 时间选择器 --><view class"line"><view classitem1><view classleft>时间</view><view class"right&quo…

NVIDIA DLI课程《NVIDIA NIM入门》——学习笔记

先看老师给的资料&#xff1a; NVIDIA NIM是 NVIDIA AI Enterprise 的一部分&#xff0c;是一套易于使用的预构建容器工具&#xff0c;目的是帮助企业客户在云、数据中心和工作站上安全、可靠地部署高性能的 AI 模型推理。这些预构建的容器支持从开源社区模型到 NVIDIA AI 基础…

深度学习中的步数指的是什么

Lora微调的截图如下: 在深度学习中,步数(steps) 是指模型参数更新的次数。每次参数更新通常对应一个或多个批次的梯度计算和优化器更新。以下是计算总步数的方法以及步数的具体含义: 1. 步数的计算公式 总步数(Total Optimization Steps)可以通过以下公式计算: [ \te…

【可实战】测试用例组成、用例设计方法、用例编写步骤、测试用例粒度、用例评审(包含常见面试题)

一、测试用例组成 &#xff08;一&#xff09;测试用例的组成 用例编号&#xff0c;模块&#xff0c;测试点&#xff08;测试标题&#xff09;&#xff0c;优先级&#xff0c;前提条件&#xff0c;测试步骤&#xff0c;期望结构&#xff0c;实际结果并不是每一项都必须&#…

Redis两种主要的持久化方式是什么?

Redis支持两种主要的持久化方式&#xff0c;它们分别是RDB&#xff08;Redis Database Snapshotting&#xff09;和AOF&#xff08;Append Only File&#xff09;。以下是这两种持久化方式的详细介绍&#xff1a; 一、RDB&#xff08;Redis Database Snapshotting&#xff09; …

【强化学习】演员评论家Actor-Critic算法(万字长文、附代码)

&#x1f4e2;本篇文章是博主强化学习&#xff08;RL&#xff09;领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对相关等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅…

《新概念模拟电路》-电流源电路

电流源电路 本系列文章主要学习《新概念模拟电路》中的知识点。在工作过程中&#xff0c;碰到一些问题&#xff0c;于是又翻阅了模电这本书。我翻阅的是ADI出版的&#xff0c;西安交通大学电工中心杨建国老师编写的模电书。 本文主要是基于前文《新概念模拟电路》-三极管的基础…

Linux下编译安装PETSc

本文记录在Linux下编译安装PETSc的流程。 零、环境 操作系统Ubuntu 22.04.4 LTSVS Code1.92.1Git2.34.1GCC11.4.0CMake3.22.1oneAPI2024.2.1 一、安装依赖 1.1 安装oneAPI 参见&#xff1a;Get the Intel oneAPI Base Toolkit , Get the Intel oneAPI HPC Toolkit 1.2 安…

初学vue3心得

这几年经济形势不好,国外对程序员的要求一直都是全栈,国内也慢慢要求通才,作为一名后端算法工程师,最近在学vue3,以下是最近学习的一点心得: 所有的npm install命令前面一定要改成cnpm install,提高速度 在main.js中引入了import "element-plus/dist/index.css";这…

【顶刊TPAMI 2025】多头编码(MHE)之极限分类 Part 4:MHE表示能力

目录 1 MHE的表示能力2 基于Frobenius-范数的低秩逼近3 基于CE的低秩近似 论文&#xff1a;Multi-Head Encoding for Extreme Label Classification 作者&#xff1a;Daojun Liang, Haixia Zhang, Dongfeng Yuan and Minggao Zhang 单位&#xff1a;山东大学 代码&#xff1a;h…

SRS 服务器入门:实时流媒体传输的理想选择

在当今视频流媒体需求爆炸式增长的时代&#xff0c;如何选择一款高效、稳定且功能强大的流媒体服务器成为了许多开发者和企业关注的焦点。而 SRS&#xff08;Simple Realtime Server&#xff09;作为一款开源的流媒体服务器&#xff0c;以其卓越的性能和灵活的功能&#xff0c;…