数据库 06-03 时间戳,多版本MVCC,快照隔离,幻读

01.什么是时间戳
“时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。通俗的讲, 时间戳是一份能够表示一份数据在一个特定时间点已经存在的完整的可验证的数据。

02.用时间戳实现调度
在这里插入图片描述

定义在这里插入图片描述
数据库给予一个事务一个时间戳(具有唯一性)

时间戳的标志是TS(),TS(Ti)表示 事务 Ti的时间戳
在这里插入图片描述数据库两种定义时间戳的方法:

在这里插入图片描述
无论如何定义时间戳,都会按照时间来进行调度的串行化
在这里插入图片描述
时间戳实现调度中每个数据项有两个重要的时间戳:

都是成功执行方法的事务的最大的时间戳:
在这里插入图片描述

时间戳排序协定的具体过程:
在这里插入图片描述

这里比较的都是用的事务最开始被系统设定的时间戳,成功的后的值也是执行方法的事务的时间戳的值,不是读写方法过程的那一刻的系统时间戳

1.事务读方法用数据项的写的时间戳:

在这里插入图片描述
2.事务写方法用数据项的读和写的时间戳:
在这里插入图片描述
事务如果回滚,属于事务的时间戳会重置:
在这里插入图片描述

例子:
在这里插入图片描述

在这里插入图片描述
时间戳排序的缺点:

可以保证调度串行化,但是由于长事务的IO时间长,会导致数据项的两个时间戳都大于这个IO事务的时间戳,会反复回滚。
在这里插入图片描述
改进方法:

在这里插入图片描述
1.保证事务写入数据项A时候,数据项A的读时间戳绝对不会大于现在这个时刻的时间戳,万一事务就是刚刚创建的呢
在这里插入图片描述

在这里插入图片描述
2
在这里插入图片描述
3.这个是可恢复调度(已经读了)
可恢复调度:先写数据的事务,先提交
无级联调度:在事务之间,读操作之前提交。在这里插入图片描述
托马斯写作规则:改进型时间戳协议

用原来的时间戳排序来调度T27和T28
在这里插入图片描述T27的写函数不能写入,T27回滚

在这里插入图片描述
解释:在这里插入图片描述
改进的方向:

在这里插入图片描述

Thomas写规则:

在这里插入图片描述
区别:
在这里插入图片描述

托马斯写作规则的主要改革是无视过时的写作行为。

在这里插入图片描述
在调度4中,T27的read(Q)和T28的write(Q) 指令冲突了,这个调度不是冲突串行化的。

在这里插入图片描述

基于有效性检查的协议:

在这里插入图片描述

具体内容:

每一个事务都分成三个阶段:读阶段,有效检查阶段,写阶段
在这里插入图片描述

重点是第二步.要进行有效性检测的需要的参数

三个阶段分别有自己的标志时间戳:

在这里插入图片描述
把Validation(Ti)作为事务Ti的时间戳,参加有效性检测,参与时间戳排序,看是不是可以串行化
在这里插入图片描述
在这里插入图片描述

有效性检测的具体要求:完成以下两个条件之一,就算是通过,可以得到的结论 TS(Tk)<TS(Ti) ,事务k在事务i之前完成

在这里插入图片描述
1.Finsh(Tk) 写完成 < Start(Ti) 读开始 -------- 事务k在事务i之前完成,调度可以串行化
在这里插入图片描述

Finsh(Tk) 写完成 < Validation(Ti) 验证阶段开始,这个只能证明两个写阶段时间绝对不一样,一个已经写完,一个还没有开始还在验证,在事务Tk的写阶段,这个时间有可能Ti还在读阶段没有结束啊

并且 两个事务 Tk的写 和 Ti的读 的数据项集合不相交,这表明事务的读写指令不冲突,可冲突串行化

在这里插入图片描述

例子:在这里插入图片描述
图中的validate就是检测阶段: display(A+B)< T26的 validate 并且 T25的写阶段 和 T26的读阶段 并没有冲突,这个是满足第二条的,只是这个时候Tk=T25,Ti=T26

在这里插入图片描述
可以自动预防级联回滚,(级联回滚的关键在于,如果存在依赖的情况下,依赖的一方先行提交的话,被依赖的事务如果在后续的运行中发生错误的话,被依赖的事务可以回滚,但是已经提交的事务不可以回滚,因为已经提交了,有效性检测协议的第二步有效检测,第一条条件是 写阶段完成时间<读阶段开始时间 这个就已经自动预防级联回滚了。第二条,写阶段的数据项集合与读阶段的数据项的集合并没有交集,没有依赖,这说明也已经自动预防级联回滚了),
在这里插入图片描述

多版本:

在这里插入图片描述


这里系统给事务一个时间戳
在这里插入图片描述

每一个数据项都有一组版本
在这里插入图片描述
一个版本有三个元素:C,W,R
在这里插入图片描述

write方法创建一个数据项的新版本
content 是 写入数据的值
W,R初始化的时候,都是事务本身的时间戳

成功读取这个数据项版本的条件是R<TS(Ti), 即读取这个版本的事务要比创建这个版本的事务要新一些 ,事务Ti就可以成功读取这个版本的数据,R更新成为TS(Ti),要更加新一些。
在这里插入图片描述
具体排序事务过程:

这里的写时间戳 W 是 创建这个数据项版本的事务的时间戳
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
第二条,TS(Ti)<R ,说明要访问这个版本的事务是比较先创建的
TS(Ti)=W,说明是这个数据项版本的创建者,可以重新写里面的数据
TS(Ti)>R,说明新的事务访问这个版本

在这里插入图片描述
数据项版本的删除
在这里插入图片描述
优点:

在这里插入图片描述
不足

在这里插入图片描述

改进
在这里插入图片描述
更新事务

这个时候,版本的时间戳不是创建这个版本的事务的时间戳,而是一种计数器
在这里插入图片描述
更新事务的读写操作:读+在数据项加共享锁+读取最新版本的内容
写 +在数据项加排他锁+创建一个新的版本+新版本的时间戳是无穷大
在这里插入图片描述
数据项的所有版本的值都是ts-counter+1,再将数据项的本身的ts-counter+1,这就会让数据项的ts-counter(类似指针)指向Ti创建的版本,也就是最新版
在这里插入图片描述

在这里插入图片描述

只读事务
在这里插入图片描述

数据项版本的删除
在这里插入图片描述
快照隔离:
在这里插入图片描述
快照的定义在这里插入图片描述
快照对于只读事务是理想的
在这里插入图片描述

快照对更新事务的写方法需要检查,因为可以存在两个事务同时写一个数据项的冲突问题
在这里插入图片描述

当事务提交的时候
在这里插入图片描述

更新事务的写方法的检查
在这里插入图片描述

在这里插入图片描述
问题是更新丢失
在这里插入图片描述
在这里插入图片描述
先提交获胜,直接检查其他并发的事务有没有提交,没有,就自己提交
在这里插入图片描述
先更新获胜(还没有提交),因为可能在更新过程中正在更新事务出现错误中止:
在这里插入图片描述
快照串行的问题:
在这里插入图片描述

快照不能保证串行化调度的实现
在这里插入图片描述
例子:两个并发的事务,都读了彼此下一步要写的数据项,这样就会在优先图中形成环,这样就会出现不能串行调度

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

注解:
优先图的形成条件:有环的话,调度就不能串行化

在这里插入图片描述

写偏斜:由于更新的是不同的数据项,所以没有快照更新检测的约束。
在这里插入图片描述在这里插入图片描述
此外:完整性约束不能在快照上进行检测,只能在数据库
在这里插入图片描述

补充:

这里的完整性约束:不是数据库数据的完整性约束
在这里插入图片描述
在这里插入图片描述

我们先举个例子。如图所示,假设完整性约束要求事务执行前后总有数据A和数据B的和为10。那图中的事务致性后,该完整性约束依然满足。因此,这个事务就满足一致性。
在这里插入图片描述
这是我们发现,“完整性约束”是一个外在的业务约束。这就意味着,同样的操作,对应的外在的业务约束不同,则该操作可能满足事务条件,又可能不满足事务条件。假设完整性约束要求事务执行前后总有数据B减数据A为8,那图中的事务便不成立,因为它执行结束后该完整性约束不在满足,即不满足一致性。

说到这里,大家可能发现了一些不对劲的地方。这可能也是大家最开始困惑的源头。因为,在事务的ACID约束中,一致性与其他三个特性也颇有不同。其实这点确实引发了一些争议。

其他三个特性均是事务内在保证的,而一致性的约束条件是由外部业务逻辑规定的。这就意味者,同样的一个操作,根据外部业务逻辑规定的完整性约束的不同,可能满足事务要求,也可能不满足。

另一个例子:
在这里插入图片描述

新增一个只读的事务
在这里插入图片描述
此时优先图出现环

在这里插入图片描述
调度串行化的目的是保证数据库的一致性,如果不是串行化的调度,但是一致性可以保证,非串行化调度也可以进行

在这里插入图片描述

在这里插入图片描述
例子:插入操作在快照检测中可以通过(并没有更新相同的元组,也就是相同的数据项),但是同时出现两个一样的主键,会在提交的时候,报错
在这里插入图片描述

串行化表示作用和一个串行的调度一个效果,很明显,这个快照插入不会固定结果输出,没有保证一致性,是非串行的:
在这里插入图片描述
原因
在这里插入图片描述
改进方法:
在这里插入图片描述

在这里插入图片描述

当同一个查询在不同的时间产生不同的结果集时,事务中就会出现所谓的幻象问题。例如,如果 SELECT 执行了两次,但第二次返回了第一次没有返回的行,则该行是“幻像”行。

举个例子

假设一个事务在 T1 时刻和 T2 时刻分别执行了下面查询语句,途中没有执行其他任何语句:

SELECT * FROM t_test WHERE id > 100;

只要 T1 和 T2 时刻执行产生的结果集是不相同的,那就发生了幻读的问题,比如:

T1 时间执行的结果是有 5 条行记录,而 T2 时间执行的结果是有 6 条行记录,那就发生了幻读的问题。
T1 时间执行的结果是有 5 条行记录,而 T2 时间执行的结果是有 4 条行记录,也是发生了幻读的问题。

在这里插入图片描述
for update 会把 读取的数据 当做更新来执行,就会出现 两个快照更新的局面,用上面的两个方法中的一个(先提交获胜, 先更新获胜)
在这里插入图片描述

在这里插入图片描述

并发控制扩展到插入和删除:

在这里插入图片描述在这里插入图片描述

01.删除:
在这里插入图片描述

删除和基本四种,读,写,插入,删除都有冲突:这里指的是并发的那一瞬间

删除之后读,找不到相关的数据项,出现错误

删除之后写,找不到相关的数据项,出现错误

删除之后删除,找不到相关的数据项,出现错误

前提条件是关系中没有这个数据项,删除之后新增,删除找不到数据项,出现错误

在这里插入图片描述
改进
在这里插入图片描述
02.插入

在这里插入图片描述
03.读select
在这里插入图片描述

例子
T30,T31

在这里插入图片描述

在这里插入图片描述

预计的冲突:在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
解决方法
在这里插入图片描述

T30的查询过程

在这里插入图片描述

在这里插入图片描述在这里插入图片描述

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

美国B2987A是德科技静电计

181/2461/8938产品概述&#xff1a; 图形皮安计/静电计&#xff0c;可自信地测量低至0.01 fA和高达10 PΩ的电流 是德科技B2981A和B2983A毫微微/皮安计以及B2985A和B2985A静电计/高阻计不仅提供同类最佳的测量性能&#xff0c;还提供前所未有的功能来最大限度地提高您的测量信…

网络广播系统是什么?网络广播的作用及应用

网络广播系统是什么?网络广播的作用及应用 商场广播的目的&#xff1a;提醒人员有序、监控配合点对点呼叫、物品遗失广播、背景音乐防噪、紧急情况呼叫等等&#xff0c;各个场景有各个场景的需求模式&#xff0c;广播系统的建设重点在于突发情况的应对&#xff0c;国家已经把广…

更改el-cascade默认的value和label的键值

后端返回的树结构中&#xff0c;label的key不是el-cascade默认的label&#xff0c;我需要改成对应的字段&#xff0c;但是一直没有成功&#xff0c;我也在文档中找到了说明&#xff0c;但是我没注意这是在props中改&#xff0c;导致一直不成功 这是我一开始错误的写法&#xf…

vue快速入门(十二)v-key索引标志

注释很详细&#xff0c;直接上代码 上一篇 新增内容 v-key的使用场景数组筛选器的使用 源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, i…

03-JAVA设计模式-适配器模式

适配器模式 设么是适配器模式 它属于结构型模式&#xff0c;主要用于将一个类的接口转换成客户端所期望的另一种接口&#xff0c;从而使得原本由于接口不兼容而无法协同工作的类能够一起工作。 适配器模式主要解决的是不兼容接口的问题。在软件开发中&#xff0c;经常会有这…

C#操作MySQL从入门到精通(6)——对查询数据进行排序

前言 在和MySql数据库交互的过程中,查询数据是使用最频繁的操作,并且我们经常需要对查询到的数据进行排序后输出,比如我想查询1列数据的最小值,那么我可以将查询到的数据进行升序(从小到大)排列,然后取第一个数据就是最小值。本文详细介绍了对查询数据进行排序的各种操…

第一届长城杯初赛部分wp(个人解题思路)

目录 Black web babyrsa2 APISIX-FLOW cloacked 本人不是很擅长ctf&#xff0c;这只是我自己做出的西部赛区部分题的思路&#xff0c;仅供参考 Black web 访问http://192.168.16.45:8000/uploads/1711779736.php 蚁剑连接 访问/var/www/html/u_c4nt_f1nd_flag.php babyr…

C语言 | Leetcode C语言题解之第17题电话号码的字母组合

题目&#xff1a; 题解&#xff1a; char phoneMap[11][5] {"\0", "\0", "abc\0", "def\0", "ghi\0", "jkl\0", "mno\0", "pqrs\0", "tuv\0", "wxyz\0"};char* digits…

Win11 使用 WSL2 安装 linux 子系统 ubuntu,删除 linux 子系统 ubuntu

Win11 使用 WSL2 安装 linux 子系统 ubuntu&#xff0c;删除 linux 子系统 ubuntu 1、用 部署映像服务和管理工具 dism.exe 命令&#xff0c;开启 WSL2 按【WIN R】&#xff0c;打开【运行】&#xff0c;输入&#xff1a;【cmd】&#xff0c;管理员打开【命令行提示符】。 …

Vue项目打包配置生产环境去掉console.log语句的方法

一、Vue2项目 使用webpack内置的 terser 工具&#xff0c;在vue.config.js文件加上相应的配置即可。 二、Vue3项目 同样是使用 terser 工具&#xff0c;不过vite没有内置terser&#xff0c;需要手动安装依赖 安装完后在vite.config.js文件加上相应的配置即可。 2024-4-9

SWM341系列应用(RTC、FreeRTOS\RTTHREAD应用和Chip ID)

SWM341系列RTC应用 22.1、RTC的时钟基准 --liuzc 2023-8-17 现象:客户休眠发现RTC走的不准&#xff0c;睡眠2小时才走了5分钟。 分析与解决&#xff1a;经过排查RTC的时钟源是XTAL_32K&#xff0c;由于睡眠时时设置XTAL->CR0&#xff1b;&#xff0c;会把XTAL_32K给关…

AIoT人工智能物联网----刷机、系统安装、示例、摄像头等

软件链接见文末 1. jetson nano硬件介绍 载板 模组卡座:放置核心板 micro SD卡接口:插SD卡,将操作系统写入SD卡,然后插入;建议至少为32GB。当然根据使用情况可以是64GB;卡的质量一定要好,读写速度快。之前买了同品牌128G的比64G的慢很多。所以大小合适就好M.2 Key E …

Matlab进阶绘图第50期—气泡堆叠蝴蝶图

气泡堆叠蝴蝶图是堆叠蝴蝶图与气泡图的组合—在堆叠蝴蝶图每根柱子上方添加大小不同的气泡&#xff0c;用于表示另外一个数据变量&#xff08;如每根柱子各组分的平均值&#xff09;的大小。 本文利用自己制作的BarBubble工具&#xff0c;进行气泡堆叠蝴蝶图的绘制&#xff0c…

Redis 详细考点

Redis 哪些地方用到 Redis 点赞、关注、登录验证码、登录的凭证、用户 redis 的 key 设计 package com.conquer.community.util;import com.conquer.community.entity.User;public class RedisKeyUtil {private static final String SPLIT ":";private static f…

ArcGIS Desktop使用入门(四)工具箱——属性域

系列文章目录 ArcGIS Desktop使用入门&#xff08;一&#xff09;软件初认识 ArcGIS Desktop使用入门&#xff08;二&#xff09;常用工具条——标准工具 ArcGIS Desktop使用入门&#xff08;二&#xff09;常用工具条——编辑器 ArcGIS Desktop使用入门&#xff08;二&#x…

实时多目图像拼接算法

实时多目图像拼接算法可以用于将多个视角的图像拼接成一个全景图像或者视频。 以下是一种常见的实时多目图像拼接算法的基本实现步骤: 特征提取与匹配: 对于每个输入图像,使用特征提取算法(如SIFT、ORB等)来提取图像中的特征点。然后,使用特征描述符(如ORB描述符)来描述…

《自动化办公》Python-操控-Word

虽然Word不好用, 但还必须得用它, python-docx是专门用于编辑Word文档的一个工具库, 它有两大用途, 自动化生成word文档 and 自动化修改文档 1. 自定义样式 python可以自定义三类样式 段落样式字符样式表格样式(一般用不到) 这三类样式的创建方式基本一致, 只是创建参数 略有不…

C++11:超进化--lambda表达式

目录 一、lambda表达式的引入 二、lambda表达式的语法 2.1lambda表达式各部分说明 2.2lambda函数的初步使用 2.3详谈捕捉列表 2.3.1[var][&var] 2.3.2[]传值捕捉当前域所有对象 2.3.3[&]传引用捕捉所有对象 2.3.4[&,val]混合捕捉 ​编辑 三、lambda底层、la…

windows远程桌面RDP提示登录密码失败次数过多帐户被锁定的解决方法

网上说的那些都不靠谱&#xff0c;乱来的&#xff0c;其实很简单&#xff0c;在计算机地址栏IP或域名后面空格加上“/admin”就可以登录进去&#xff0c;意思应该是以管理员的身份登录进去&#xff0c;这个用户必须要有管理员的权限&#xff0c; 这个操作秘密真的是深藏不露啊…

实战要求下,如何做好资产安全信息管理

文章目录 一、资产安全信息管理的重要性二、资产安全信息管理的痛点三、如何做好资产安全信息管理1、提升资产安全信息自动化、集约化管理能力&#xff0c;做到资产全过程管理2、做好资产的安全风险识别3、做好互联网暴露面的测绘与管空4、做好资产安全信息的动态稽核管理 “摸…