Oracle的数据一致性机制原理

news2024/9/30 17:30:10

一、前言

在单用户环境下,在操作数据库是不需要考虑其他用户会修改同一个数据。但是在多用户的情况下,多个事务可能会修改同一个数据,最终会得到错误的数据结果。

Oracle数据库是通过 multiversion consistency model(多版本数据一致性模型)、还有不同类型的锁、事务隔离保证数据的一致性。

通过这种方式,数据库可以向多个并发用户提供在某一个时间点所对应的数据库数据。由于不同版本的数据块可以同时存在,事务可以查询所需时间点已经提交的数据版本,并返回对应时间点已提交的数据查询结果。(数据块的头部存储了历史事务信息)

提问:什么是数据一致性呢?

在数据库中,数据一致性是指在多个并发事务同时访问数据库时,确保读取操作的结果对于所有事务都是一致的。

这意味着当一个事务正在读取数据时,如果其他事务正在对相同的数据进行修改或写入操作,读取操作不应该看到未完成的或部分更改的数据。相反,读取操作应该看到已经提交的、完整的数据,以确保事务之间的数据一致性。

二、数据读一致性

数据的读一致性分为两个层面,一个是语句级别的读一致性,另外一个是事务级别的读一致性。

2.1、语句级别读一致性(Statement-Level Read Consistency)

Oracle数据库强制使用语句级别的读一致性,这样保证每次返回的数据是在这个时间节点之前已经提交的数据。

在这里插入图片描述
当进行一次查询时,发生在 SCN 10023(SCN是Oracle数据库的一种顺序标识,代表事务先后),只会看到10023之前已经提交的数据。在图中有两个大于SCN10023的数据块,是SCN1024,这时 Oracle数据库会将这两个数据块拷贝到一个缓冲区中,然后根据undo segment(撤销段)中的数据重新构建这两个数据块(CR,consistent read clones)在1024前已经提交的数据,最后正确的检索就是SCN100021->SCN100021->SCN10006->SCN10008->SCN10021->SCN10011->SCN10021,过这种机制每次查询的时候查询到的都是事务已经提交的数据,防止了脏读。

提问:那什么是SCN呢?

SCN的全称是System Change Number,它在数据库中充当时钟的角色,是数据库内部使用的一个逻辑数据,Oracle数据库可以根据它的大小来判断事务发生的先后顺序。Oracle数据库是在SGA(Sytem Global Area)中完成SCN增量操作。当事务修改数据时,数据库会将新的SCN保存到与事务相对应的撤销段中(undo segment)中。

提问:即使有了SCN机制,数据库能够知道事务的先后顺序,那数据库是怎么知道事务提交了还是没有提交?

每一个数据库块(block,Oracle数据库底层逻辑存储最小单元),都有一个数据块头(block header),里面包含了在数据库块上进行的事务活动(事务执行历史),里面记录了事务的状态(活跃 Active、提交 Commit、回滚 RollBack)。

2.2、事务级别的读一致性(Transaction-Level Read Consistency)

Oracle数据同样也可以对一个事务中的多条查询语句提供读一致性。在事务中的每条语句看到的都是同一节点(同一SCN)的已经提交的数据。

2.3、读一致性的数据存储

提问:Oracle数据库是如何给每个不同SCN对应的事务看到之前已经提交的数据呢?这些数据又是放到那里呢?

要管理多版本读取一致性模型(multiversion read consistency model),数据库必须在同时查询和更新表时创建一组读取一致性数据。

这里就涉及到了撤销段,撤销段(undo segment)是数据库的一个逻辑结构,用于管理extents(区),而 extents 是由多个数据库块(block)组成。

每当用户修改数据时,Oracle 数据库都会产生一个撤销数据实体(undo entries),之后会将这个实体写入到撤销段(undo segment)中。撤销段中包含已提交事务或者未提交事务所作更改之前数据库中的旧数据,

通过这种方式,同一个数据,在不同时间节点的不同版本数据可以存在于数据库中。这样数据库可以提供不同时间节点,不同版本的数据库快照视图,来保证读一致性。

2.4、锁机制

Oracle数据的某一条事务在修改数据时,其他事务不能在进行修改,实现这种操作就要使用到锁机制。

锁我的理解是它是一种机制,一种用于防止破坏性交互行为的机制,破坏性行为就是指并发修改某一个数据,修改后的结果是错误的,通过锁这种机制来避免错误的修改结果,保证数据库数据的一致性。

锁大致可以分为两类,一种是排他锁,另外一种是共享锁。多个资源在竞争锁时,只有一个资源能够获取到排他锁,多个资源可以获取到共享锁。只有当修改数据时,数据才会被锁定,正常情况下是锁定一行数据,而不是整张数据库表。

三、事务隔离级别

Oracle数据库提供三种事务隔离级别分别是RC(read committed)、Serializable、read-only。

在这里插入图片描述
3.1、RC隔离级别

RC隔离级别是Oracle数据库默认的隔离级别,在RC隔离级别下可以保证每次查询到的数据都是事务已经提交的数据,不会读取到事务未提交的数据,保证数据的一致性。也就说当一个查询正在查询一个表中id为2的数据时,此时另外一个事务把该数据修改了,但是查询出的结果是修改之前的结果,不会查询到事务未提交的结果。

在RC隔离级别下,可能会出现更新丢失的问题。这是一个很诡异的现象。举个例子说一下:

假设某公司要给小张涨工资1k,现在有两个财务操作员A和B,它们进行了以下操作:

1.操作员A查询出了小张现有的工资,选择了薪水修改,并输入了要提薪的1000数据,但此时有事,临时走开了,没有提交(事务未提交)。

2.操作员B查询出小张现有的工资,选择了薪水修改,并输入了要提薪的1000数据,然后提交了修改。

3.操作员A忙完事情回来了,然后提交了修改。

小张高兴坏了,自己涨了两千的工资。

在这个例子中操作员A没有提交,但是在提交的时候要重新查询一下看一下薪水有没有被修改。这样不会造成操作员B的修改丢失。

比如可以通过乐观锁的形式,给表上添加版本列进行解决,版本列可以是日期,一个递增的版本数字等。这是一种比较好的方式,当然也存在其他方式。

3.2、Serializable隔离级别

Serializable隔离级别是Oracle数据库最高级的事务隔离级别,在这个级别下,数据库确保事务之间的操作不会相互干扰(行级锁定、多版本并发控制等),从而保证了数据的一致性和完整性。

在序列化事务隔离级别下,事务只能看到在事务开始时做的更改以及事务本身所做的更改。如果某个事务开始后,其他事务已经提交了对相同数据的修改,那么这个事务就会被视为尝试修改已经被其他事务更改的数据,此时Oracle数据库会抛出ORA-08177: Cannot serialize access for this transaction异常。

3.3、Read-Only隔离级别

read-only事务隔离级别,是一个简单粗暴的事务隔离级别,它只允许事务进行读取数据,不允许修改数据,但是当用户是sys用户时将允许进行数据修改。

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

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

相关文章

HDFS客户端及API操作实验

实验二 HDFS客户端及API操作 实验目的: 1.掌握HDFS的客户端操作,包括上传文件、下载文件、重命名、查看目录等; 2.掌握HDFS的Java API使用,能够利用Java API实现上传、下载等常用操作; 实验内容: HDF…

使用coco数据集进行语义分割:数据预处理与损失函数

如何coco数据集进行目标检测的介绍已经有很多了,但是关于语义分割几乎没有。本文旨在说明如何处理 stuff_train2017.json stuff_val2017.json panoptic_train2017.json panoptic_val2017.json,将上面那些json中的dict转化为图片的label mask&am…

【Qt开发流程】之定时器事件与随机数示例

描述 QObject是所有Qt对象的基类,提供了Qt中基础的定时器支持。通过QObject::startTimer()函数,可以使用毫秒为单位的时间间隔来启动一个定时器。该函数返回一个唯一的整数定时器ID。该计时器现在将以规律的间隔触发,直到显式调用QObject::k…

谷歌用AI模型发现220万种新材料,研究能力超越人类!

谷歌旗下的AI研究机构DeepMind在全球顶级学术期刊《Nature》上发布了一篇论文,通过深度学习、计算机视觉、大数据等,开发了一个名为GNoME的图神经网络模型,主要用于材料发现。 研究团队通过GnoME便快速发现了220万个新的材料晶体结构&#x…

JVM==>图解字节码指令

一,原始代码 我们来看一下执行这段代码的具体流程 那执行这段代码中 JVM就会把已经编译好的.class文件加载到内存中,交给CPU运行 1)常量池载入运行时常量池 我们发现 10 并没有被存入常量池中, 这是因为short范围以内的数字不会…

微机原理9

一、单项选择题(本大题共15小题,每小题3分、共45分。在每小题给出的四个备选项中,选出一个正确的答案,请将选定的答案填涂在答题纸的相应位置上。) 8088 系统的内存最大容量为 16MB. 其地址总线为() A. 16 位 B. 20 位 C. 24 位 D. 32 位 2,以CPU为核心…

YITH WooCommerce Social Login跨境电商网站社交登录高级版插件

点击阅读YITH WooCommerce Social Login跨境电商网站社交登录高级版插件原文 YITH WooCommerce Social Login跨境电商网站社交登录高级版插件让您的用户节省时间并通过他们的社交资料之一登录或注册网站。 您如何从中受益: 用户无需填写表格、插入个人数据&#…

【数电笔记】06-码制

目录 说明: 二进制代码 1. 二 - 十进制码 2. 常用二 - 十进制代码表 2.1 例题 可靠性代码 1. 格雷码 2. 奇偶校验码 3. 8421奇偶校验码表 说明: 笔记配套视频来源:B站;本系列笔记并未记录所有章节,只对个人认…

计算机基础知识64

ForeignKey属性 to:设置要关联的表 related_name: 反向操作时,使用的字段名,用于代替原反向查询时的’表名_set’ related_query_name:反向查询操作时,使用的连接前缀,用于替换表名 to_field:设置要关联的表…

【数据分享】2015-2023年我国区县逐月二手房房价数据(Excel/Shp格式)

房价是一个城市发展程度的重要体现,一个城市的房价越高通常代表这个城市越发达,对于人口的吸引力越大!因此,房价数据是我们在各项城市研究中都非常常用的数据!之前我们分享过2015-2023年我国地级市逐月房价数据&#x…

关于你对 Zookeeper 的理解

看看普通人和高手是如何回答这个问题的? 普通人 Zookeeper 是一种开放源码的分布式应用程序协调服务 是一个分布式的小文件存储系统 一般对开发者屏蔽分布式应用开发过过程种的底层细节 用来解决分布式集群中应用系统的一致性问题 高手 对于 Zookeeper 的理解…

【ArcGIS Pro微课1000例】0047:深度学习--棕榈树提取全流程

一、创建训练样本 对汤加科洛瓦伊种植园每棵棕榈树的健康状况进行清查和评估,这需要花费大量的时间和劳动力。 为简化此过程,将在 ArcGIS Pro 中使用深度学习模型来识别树木,然后根据植被绿度的测量值计算其健康状况。 第一步是找到显示汤加科洛瓦伊的影像,该影像具有足够…

VQD视频质量诊断服务/图像质量诊断/视频流质量诊断/传统方法与深度学习结合的视频质量诊断

随着平安城市、大安防的发展,监控摄像机数量的不断增加,给监控系统的维护工作带来了新的挑战。如何及时了解前端视频设备的运行情况,发现故障并检测恶意遮挡与破坏的不法行为已成为视频监控系统运行的首要迫切问题。对于成千上万个监控摄像机…

Vue3 组合式实现 带连接线的Tree型 架构图(一级树形图)

创建组件名称 TreeNodeView.vue <template><div class"tree-node"><div class"node">{{ rootNodeName }}</div><div class"children" :style"childrenLineStyle"><div class"child-node"…

练习十一:简单卷积器的设计

简单卷积器的设计 1&#xff0c;任务目的&#xff1a;2&#xff0c;明确设计任务2.1,目前这部分代码两个文件没找到&#xff0c;见第5、6节&#xff0c;待解决中。 &#xff0c;卷积器的设计&#xff0c;RTL&#xff1a;con1.v4&#xff0c;前仿真和后仿真&#xff0c;测试信号…

一键自动修改和翻新OC源码,解决苹果审核4.3和马甲问题

ipaguard 自动修改/翻新/混淆/OC/iOS代码&#xff0c;自动替换类名&#xff0c;方法名 由来 网上有很多关于如何混淆iOS源码的方法&#xff0c;但是都不够智能&#xff0c;生成的方法类名要么千奇百怪&#xff0c;要么aaaabbbxxx这种完全毫无意义的名称&#xff0c;要么只能…

全网最新最全的自动化测试:python+pytest接口自动化-接口测试基础

接口定义 一般我们所说的接口即API&#xff0c;那什么又是API呢&#xff0c;百度给的定义如下&#xff1a; API&#xff08;Application Programming Interface&#xff0c;应用程序接口&#xff09;是一些预先定义的接口&#xff08;如函数、HTTP接口&#xff09;&#xff0c…

TEMU跨境平台与亚马逊检测认证几大认证您知道多少?

TEMU跨境平台与亚马逊检测认证几大认证您知道多少&#xff1f; TEMU跨境平台与亚马逊对于做外贸的人应该都不陌生,可是你是否知道产品入驻TEMU跨境平台与亚马逊需要办理的13大认证呢?如果你不知道,请认真阅读正面的内容,因为它关系着你的产品能否在TEMU跨境平台与亚马逊顺利上…

零基础学编程,中文编程工具构件之弹出菜单构件教程,中文编程工具下载

一、前言&#xff1a; 零基础自学编程&#xff0c;中文编程工具下载&#xff0c;中文编程工具构件之扩展系统菜单构件教程 编程系统化教程链接https://jywxz.blog.csdn.net/article/details/134073098?spm1001.2014.3001.5502 给大家分享一款中文编程工具&#xff0c;零基础…

二进制动态插桩工具intel PIN的学习笔记

前言 最近两周为了课程汇报学习了intel PIN这个动态插桩&#xff08;dynamic instrument&#xff09;工具&#xff0c;总体的学习感受还是挺累的。一方面&#xff0c;这个方向比较小众&#xff0c;相关的二手资料比较少&#xff0c;能参考的也就只有官方手册这种一手资料&…