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

并发控制-事务的调度、数据不一致问题(更新丢失、脏读、不可重复读)、非串行调度的的可串行化

一、引言

1、数据库管理系统DBMS的事务处理技术实现的另一个主要功能部分是并发控制机制。并发控制机制完成的功能就是对并发执行的事务进行控制,保证事务的隔离性,从而进一步保持数据库的一致性。

2、事务的并发控制就是对并发执行的不同事务中的数据库的交错执行进行调度,解决并发事务的非串行调度带来的数据不一致问题,使非串行调度可串行化

二、事务的调度

1、事务的调度是指多个并发执行的事务中的并发操作按照它们的执行时间顺序形成的一个操作序列 

  • 在调度中,某个事务中的操作执行顺序与单个事务执行时的操作顺序应该是相同的
  • 但并发事务中的操作可以交错执行 

 2、在调度中,若每个事务中的操作都是连续执行的,不存在不同事务中的操作的交错执行,则称该调度为串行调度,否则称为非串行调度

(1)对于这里给出的两个事务T1和T2,我们仍用对缓冲区数据的读写来表达对数据库的读写操作,变量t、s分别是事务中的局部变量,不是数据库中的数据,数据X、Y为数据库中的数据在内存缓冲区中的值而不一定是他们在磁盘上的值,同时为了更清晰地表达对数据库的并发操作,后续我们省略掉事务定义语句

(2)则这两个事务的串行调度,可以是T1中的所有操作都在T2中的所有操作前执行,也可以是T1中的所有操作都在T2的所有操作后执行。

(3)如果两个调度中X和Y的初值一样,如X=100,Y=50,则两个串行调度的结果一样,均为X=150,Y=100。

(4)若与事务T1并发执行的事务是事务T3,则这两个事务的串行调度,当两个调度中X、Y的初值一致,假设X=100,Y=50,则结果分别为X=100,Y=100和X=150,Y=100,可见对于并发执行的事务,不同的串行调度的结果并不一样。但不管结果如何,多个并发事务的串行调度结果会与该多个事务的串行执行的一个结果相同。

若数据库初始时处于一致性状态,且所有的事务具有一致性,则事务的串行执行将保持数据库的一致性。所以多个并发事务的串行调度也会保持数据库的一致性

3、但并发事务中的并发操作更多地进行交错执行,构成非串行调度

这里给出了事务T1和T2的两个不同的非串行调度。当并发事务非串行调度中的操作读或写缓冲区中同一数据库对象时,就可能会产生数据不一致性问题,主要体现在更新丢失(Lost Update)、脏读(Dirty Read)和不可重复读(Non_Repeatable Read)等方面

三、数据不一致性问题

1、更新丢失(Lost Update)

更新丢失是指在并发执行的非串行调度中,来自不同事务的操作,先后读取同一数据对象并对其进行更新,一个事务对某数据对象的更新结果覆盖了另一个事务对该数据对象的更新结果,导致先写的数据更新结果丢失

比如在事务T1和T2的非串行调度中,事务T1读取了缓冲区中数据对象X之后将X值减少50,但将X值写入缓冲区之前,事务T2也读取了缓冲区中的数据对象X,将X增加了100,又在事务T1将X值写入缓冲区之后,也将X值写入缓冲区。假设X初值为100,这样缓冲区中的数据X的最终结果就是200,只增加了100而没有减少50,不是串行调度的结果150。事务T1对X的更新结果丢失

2、脏读(Dirty Read)

脏读是指在并发事务的非串行调度中,一个事务读取了另一个还没有提交的事务所写的中间结果数据(脏数据)。脏读也就是对脏数据的读取。

比如在事务T1和T2的非串行调度中,事务T1读取了缓冲区中数据对象X之后,将X值减少50并将X值写入缓冲区,假设X的初值为100,此时缓冲区中的数据X的结果就是50,随后事务T2读取了事务T1对X的更新结果并进行计算,即事务T2读取的X值为50,但事务T1在完成之前发生了故障,事务T1撤销回滚,将X的值恢复为事务T1开始时的初值,即100,这样事务T2读取的是夭折事务T1对X的中间更新结果值50,是脏数据,并在此基础上对X进行了更新,使数据库处于不一致状态,

3、不可重复读(Non_Repeatable Read)

不可重复度是指在并发事务的非串行调度中,同一事务同一数据对象进行多次读取得到不同的结果。

比如在事务T1和T2的非串行调度中,事务T1读取数据对象X,假设此时X的值为100,随后事务T2执行了对数据库对象X的更新操作,X值增加100,当事务T1再次读取数据对象X时,X值为200,无法再现前一次读取的结果,事务T1产生了不可重复读现象。

还比如事务T1每次读取X后,又读取数据Y,并对X和Y进行求和,在两次操作之间,事务T2对数据X进行了更新,则事务T1两次的求和结果不同,用户会感觉得到了一个错误的求和结果,这也是一种不可重复读现象

4、产生上述不一致问题的主要原因是并发事务的非串行调度的执行,使并发的事务之间互相干扰,破坏了事务之间的隔离性

5、为解决这些问题,需要对并发执行的事务进行控制,使得一个事务的执行不受其他事务的干扰,从而避免数据的不一致性。由于多个并发事务的串行调度不会破坏数据库的一致性,如果通过控制,将并发事务的非串行调度的执行效果与这些并发事务的串行调度的执行效果相同,则仍可保持数据库的一致性

因此,并发控制要实现的就是并发事务的非串行调度的可串行化

四、非串行调度的可串行化

1、如果n个并发事务的一个非串行调度S的执行效果等价于这n个事务的某个串行调度S^{'}的执行效果,那我们就称这n个事务的该非串行调度S是可串行化的调度

2、这里的等价是指对于任意的数据库初始状态,调度S和 S^{'}的执行效果都相同

这里给出两个事务的非串行调度,其中左边的这个调度就是可串行化的,在这个调度中,从任何一个一致的数据库状态开始,其结果都与先执行T1再执行T2的串行调度的结果一样,而右边的这个调度确是一个非可串行化的调度,其结果并不总与T1、T2的任一串行调度的结果相同。虽然可能存在某一算数的巧合,使得其结果相同,但仍是非可串行化的调度,可自行设定初始状态进行验证

3、对于并发事务的非串行调度,当且仅当是可串行化的,才能保持事务的隔离性

4、因此,我们把“可串行化”作为对并发事务进行并发控制的目标

5、而大多数DBMS实现的是一个更强的要求,实现的是并发事务的非串行调度的冲突可串行化

6、冲突是指并发事务非串行调度中一对连续的操作(读操作或写操作),操作应来自不同的事务,如果它们的执行顺序交换后,操作所在的事务中至少有一个的后续操作结果会改变,则这对操作就是冲突的

7、因此,不同事务对不同数据对象的读写操作显然是不冲突的

8、不同事务对同一数据对象的读操作也是不冲突的

9、但不同事务对同一数据对象的读写操作是冲突的。下面我们用ri(X)和wi(X)分别表示某事务Ti从缓冲区读数据X和往缓冲区写数据X。

  • 则不同事务对同一数据对象的写操作,即wi(X)和wj(X)是冲突的,因为事务Ti和Tj的写入值可能不同,交换操作的顺序,最终缓冲区中的X值是不同的,丢失的将是不同事务的更新结果

 

  • 不同事务对同一数据对象的读写操作或或写读操作,即ri(X)和wj(X)是冲突的,交换读写操作的顺序会影响到读操作所读到的数据不同,如果将写操作从读操作后移到读操作前,读操作读入的值将是新写入的值,而不是交换前应读到的值,可能会引起读操作所在事务出现不可重复读或脏读现象 

10、如果并发事务非串行调度中的相邻操作是非冲突的,则这两个操作是可以交换的,不会影响相关事务的执行效果

11、因此将一事务的非串行调度中相邻的非冲突操作通过一系列的交换后,得到的调度与交换前的调度是等价的,我们称这两个调度是冲突等价

12、而如果一个非串行调度冲突等价于一个串行调度,也就是将该非串行调度中相邻的非冲突操作进行一系列变换后可转换为一个串行调度,则称该非串行调度是冲突可串行化

比如,这里给出两个并发事务的一个非串行调度,只列出事务对缓冲区数据的读写操作,忽略了事务读取数据后在内存中的计算,因这些操作的先后不影响调度的执行结果,下面我们来判断一下这个调度是否是冲突可串行化

经过这一系列的相邻的非冲突操作的交换,得到的新调度序列等价于事务1先执行事务T2再执行大的一个串行调度,因此这里给出的这个非串行调度是冲突可串行化的

13、冲突可串行化是可串行化的一个充分条件,即冲突可串行化调度是可串行化调度

比如对于这里给出的这三个事务,它们各自为B写入一个值,事务T1和T2在为B写入值之前还都为A写入值,其并发执行的一个非串行调度S1,最受使B具有事务T3写入的值,而A具有事务T2写入的值,该调度的执行结果与事务T1、T2和T3依次执行的串行调度S2的执行结果相同,因此非串行调度S1是可串行化的调度,但由于该调度没有可交换的非冲突操作不能冲突等价于一个串行调度,所以非串行调度S1不是冲突可串行化调度

五、小结

1、DBMS的并发控制机制需采用一定的技术来保证并发事务非串行调度是可串行化的

2、目前常用的并发控制技术有

  • 封锁(实现冲突可串行化)
  • 时间戳
  • 有效确认

3、虽然冲突可串行化不是可串行化的必要条件,但商用DBMS通常实现的是冲突可串行化 

相关文章:

并发控制-事务的调度、数据不一致问题(更新丢失、脏读、不可重复读)、非串行调度的的可串行化

一、引言 1、数据库管理系统DBMS的事务处理技术实现的另一个主要功能部分是并发控制机制。并发控制机制完成的功能就是对并发执行的事务进行控制,保证事务的隔离性,从而进一步保持数据库的一致性。 2、事务的并发控制就是对并发执行的不同事务中的数据…...

Golang | Leetcode Golang题解之第202题快乐数

题目: 题解: func isHappy(n int) bool {cycle : map[int]bool{4: true, 6: true, 37: true, 58: true, 89: true, 145: true, 42: true, 20: true}for n ! 1 && !cycle[n] {n step(n)}return n 1 }func step(n int) int {sum : 0for n > …...

算法:哈希表

目录 题目一:两数之和 题目二:判定是否互为字符重排 题目三:存在重复元素I 题目四:存在重复元素II 题目五:字母异位词分组 关于哈希表 哈希表就是存储数据的容器 哈希表的优势是:快速查找某个元素O(…...

自然语言处理基本知识(1)

一 分词基础 NLP:搭建了计算机语言和人类语言之间的转换 1 精确分词,试图将句子最精确的分开,适合文本分析 >>> import jieba >>> content "工信处女干事每月经过下属科室" >>> jieba.cut(content,cut_all …...

Java中的数据加密与安全传输

Java中的数据加密与安全传输 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们来探讨一下在Java中如何实现数据加密与安全传输。 随着互联网的普及和网络…...

UG NX二次开发(C++)-根据草图创建拉伸特征(UFun+NXOpen)

1、前言 UG NX是基于特征的三维建模软件,其中拉伸特征是一个很重要的特征,有读者问如何根据草图创建拉伸特征,我在这篇博客中讲述一下草图创建拉伸特征的UG NX二次开发方法,感兴趣的可以加入QQ群:749492565,或者在评论区留言。 2、在UG NX中创建草图,然后创建拉伸特征 …...

TS_开发一个项目

目录 一、编译一个TS文件 1.安装TypeScript 2.创建TS文件 3.编译文件 4.用Webpack打包TS ①下载依赖 ②创建文件 ③启动项目 TypeScript是微软开发的一个开源的编程语言,通过在JavaScript的基础上添加静态类型定义构建而成。TypeScript通过TypeScript编译器或…...

2024年华为OD机试真题-传递悄悄话 -C++-OD统一考试(C卷D卷)

2024年OD统一考试(D卷)完整题库:华为OD机试2024年最新题库(Python、JAVA、C++合集) 题目描述: 给定一个二叉树,每个节点上站着一个人,节点数字表示父节点到该节点传递悄悄话需要花费的时间。 初始时,根节点所在位置的人有一个悄悄话想要传递给其他人,求二叉树所有节…...

eclipse基础工程配置( tomcat配置JRE环境)

文章目录 I eclipse1.1 工程配置1.2 编译工程1.3 添加 JRE for the project build pathII tomcat配置JRE环境2.1 Eclipse编辑tomcat运行环境(Mac版本)2.2 Eclipse编辑tomcat运行环境(windows版本)2.3 通过tomcat7W.exe配置运行环境(windows系统)I eclipse 1.1 工程配置 …...

Spring Boot 学习第八天:AOP代理机制对性能的影响

1 概述 在讨论动态代理机制时,一个不可避免的话题是性能。无论采用JDK动态代理还是CGLIB动态代理,本质上都是在原有目标对象上进行了封装和转换,这个过程需要消耗资源和性能。而JDK和CGLIB动态代理的内部实现过程本身也存在很大差异。下面将讨…...

Linux[高级管理]——Squid代理服务器的部署和应用(传统模式详解)

🏡作者主页:点击! 👨‍💻Linux高级管理专栏:点击! ⏰️创作时间:2024年6月24日11点11分 🀄️文章质量:95分 目录 ————前言———— Squid功能 Squ…...

使用Vue 2 + Element UI搭建后台管理系统框架实战教程

后台管理系统作为企业内部的核心业务平台,其界面的易用性和功能性至关重要。Vue 2作为一个成熟的前端框架,以其轻量级和高效著称,而Element UI则是一套专为桌面端设计的Vue 2组件库,它提供了丰富的UI元素和组件,大大简…...

Carla安装教程

1.前言 对于从事自动驾驶的小伙伴而言,或多或少应该都接触过一些的仿真软件,今天要给大家介绍的这款仿真软件应该算的上是业界非常有名的一款仿真软件——carla。 目前carla的学习教程也还是蛮多的,但是写的都不是很全,在配置的…...

【PYG】处理Cora数据集分类任务使用的几个函数log_softmax,nll_loss和argmax

文章目录 log_softmax解释作用示例解释输出 nll_loss解释具体操作示例代码解释 nll_losslog_softmaxcross_entropy解释代码示例解释 argmax()解释作用示例代码解释示例输出 log_softmax F.log_softmax(x, dim1) 是 PyTorch 中的一个函数,用于对输入张量 x 应用 log…...

Labview绘制柱状图

废话不多说,直接上图 我喜欢用NXG风格,这里我个人选的是xy图。 点击箭头指的地方 选择直方图 插值选择第一个 直方图类型我选的是第二个效果如图。 程序部分如图。 最后吐槽一句,现在看CSDN好多文章都要收费了,哪怕一些简单的入…...

使用Python实现一个简单的密码管理器

文章目录 一、项目概述二、实现步骤2.1 安装必要的库2.2 设计密码数据结构2.3 实现密码加密和解密2.4 实现主要功能2.4.1 添加新密码2.4.2 显示所有密码2.4.3 查找特定密码2.4.4 更新密码2.4.5 删除密码 2.5 实现用户界面 三、代码示例3.1 加密和解密示例3.2 用户界面示例 在现…...

【云原生】服务网格(Istio)如何简化微服务通信

🐇明明跟你说过:个人主页 🏅个人专栏:《未来已来:云原生之旅》🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、微服务架构的兴起 2、Istio:服务网格的佼…...

spring boot 整合 sentinel

注意版本问题 我这是jdk11 、spring boot 2.7.15 、 alibaba-sentinel 2.1.2.RELEASE <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.15</version><…...

蜜雪冰城小程序逆向

app和小程序算法一样 小程序是wasm...

pbootcms提交留言成功后跳转到指定的网址

pbootcms在线留言表单提交成功后&#xff0c;如何跳转到指定的网址&#xff0c;默认提交留言后留在原来的页面&#xff0c;如果提交后需要跳转到指定网址&#xff0c;我们需要对文件进行修改。首先我们打开/core-/function/helper.php文件找到第162行左右代码&#xff1a; ech…...

16、matlab求导、求偏导、求定积分、不定积分、数值积分和数值二重积分

0&#xff09;前言 在MATLAB中&#xff0c;对函数进行不同形式的求导、求积分操作是非常常见的需求&#xff0c;在工程、科学等领域中经常会用到。以下是关于求导、求积分以及数值积分的简介&#xff1a; 求导&#xff1a;在MATLAB中可以使用diff函数对函数进行求导操作。diff…...

MySQL 9.0创新版发布!功能又进化了!

作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;10余年DBA工作经验&#xff0c; Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主&#xff0c;全网粉丝10万 擅长主流Oracle、MySQL、PG、高斯及Greenplum备份恢复&#xff0c; 安装迁移&#xff0c;性能优化、故障…...

后端系统的安全性

后端系统的安全性 后端系统的安全性是任何Web应用或服务的核心组成部分&#xff0c;它涉及保护数据、用户隐私以及系统免受恶意攻击。以下是后端安全的一些关键点&#xff1a; 认证和授权&#xff1a;确保只有经过身份验证的用户才能访问特定资源。这通常包括使用用户名/密码…...

.net 百度翻译接口核心类

百度翻译api &#xff1a;http://developer.baidu.com/wiki/index.php?title帮助文档首页/百度翻译/翻译AP 核心翻译类 using System; using System.Collections.Generic; using System.Linq; using System.Text; using Newtonsoft.Json; using System.Net; using System.I…...

安卓应用开发学习:通过腾讯地图SDK实现定位功能

一、引言 这几天有些忙&#xff0c;耽误了写日志&#xff0c;但我的学习始终没有落下&#xff0c;有空我就会研究《 Android App 开发进阶与项目实战》一书中定位导航方面的内容。在我的手机上先后实现了“获取经纬度及地理位置描述信息”和“获取导航卫星信息”功能后&#x…...

iptable精讲

SNAT策略 SNAT策略的典型应用环境 局域网主机共享单个公网IP地址接入Internet SNAT策略的原理 源地址转换&#xff0c;Source Network Address Translantion 修改数据包的源地址 部署SNAT策略 1.准备二台最小化虚拟机修改主机名 主机名&#xff1a;gw 主机名&#xff1…...

2024 年如何构建 AI 软件

人工智能 (AI) 是当今 IT 行业最热门的话题&#xff0c;受到大型科技公司、大型企业和投资者的青睐。如果有人不参与 AI&#xff0c;他们就出局了。虽然“AI 泡沫”一词尚未公开使用&#xff0c;但街上的每个人都可能听说过 AI 将取代我们的工作&#xff08;可能不会&#xff0…...

Python实战,桌面小游戏,剪刀石头布

注意:本文的下载教程,与以下文章的思路有相同点,也有不同点,最终目标只是让读者从多维度去熟练掌握本知识点。 下载教程: Python项目开发实战_桌面小游戏-剪刀石头布_编程案例解析实例详解课程教程.pdf 创建一个基于Python的桌面小游戏“剪刀石头布”是一个很好的编程实践…...

Hadoop权威指南-读书笔记-01-初识Hadoop

Hadoop权威指南-读书笔记 记录一下读这本书的时候觉得有意思或者重要的点~ 第一章—初识Hadoop Tips&#xff1a; 这个引例很有哲理嘻嘻&#x1f604;&#xff0c;道出了分布式的灵魂。 1.1 数据&#xff01;数据&#xff01; 这一小节主要介绍了进入大数据时代&#xff0c;面…...

HttpServletResponse设置headers返回,发现headers中缺少“Content-Length“和“Content-Type“两个参数。

业务中需要将用httpUtils请求返回的headers全部返回&#xff0c;塞到HttpServletResponse中&#xff0c;代码如下&#xff1a; HttpServletResponse response;// 返回headers Arrays.stream(httpResponse.getHeaders()).forEach(header -> response.setHeader(header.getNa…...