事务隔离级别是如何实现的

news2024/11/23 19:48:45

事务隔离级别是如何实现的

数据库系统提供了以下 4 种事务隔离级别

  • 读未提交:解决了回滚覆盖类型的更新丢失,但可能发生脏读现象(一个事务读取到了另一个事务修改但未提交的数据),也就是可能读取到其他会话中未提交事务修改的数据。

  • 已提交读:只能读取到其他会话中已经提交的数据,解决了脏读。但可能发生不可重复读现象(一个事务中多次读取同一行记录不一致,后面读取的跟前面读取的不一致),也就是可能在一个事务中两次查询结果不一致。

  • 可重复度:解决了不可重复读,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上会出现幻读(一个事务中多次按相同条件查询,结果不一致。后续查询的结果和面前查询结果不同,多了或少了几行记录),简单的说幻读指的的当用户读取某一范围的数据行时,另一个事务又在该范围插入了新行,当用户在读取该范围的数据时会发现有新的幻影行。

  • 可串行化:所有的增删改查串行执行。它通过强制事务排序,解决相互冲突,从而解决幻度的问题。这个级别可能导致大量的超时现象的和锁竞争,效率低下

在这里插入图片描述

1.读未提交是如何实现的?

读未提交(Read Uncommitted)是最低的隔离级别,它的实现相对简单,主要通过以下两个机制来实现:

  1. 无锁读取: 在读未提交隔离级别下,读操作可以读取其他事务未提交的数据。这意味着在一个事务中,可以读取到其他事务已经修改但尚未提交的数据。数据库引擎不会对读操作加锁或进行并发冲突的检测,因此读操作可以直接读取未提交的数据。
  2. 快照读取: 为了保证事务的一致性,数据库引擎会在读未提交隔离级别下使用快照读取。快照读取是在事务开始时创建的一个数据快照,用于保持读操作的一致性。快照读取时,会根据事务开始时的快照获取数据的版本。这样可以避免读取到在事务执行期间被其他事务修改的数据。

需要注意的是,读未提交隔离级别下存在脏读(Dirty Read)的问题,即读取到其他事务修改但未提交的数据。这可能导致不一致的查询结果,因为读取到的数据可能在之后被回滚或修改。因此,在读未提交隔离级别下,事务之间的数据依赖关系和一致性无法得到保证。

由于读未提交隔离级别的问题,它很少在生产环境中使用,更常见的是使用较高的隔离级别,如可重复读(Repeatable Read)或串行化(Serializable),以确保数据的一致性和事务的隔离性。

2.已提交读是如何实现的?

已提交读(Read Committed)是一种隔离级别,它在数据库中的实现主要依赖以下两个机制:

  1. 行级锁: 在已提交读隔离级别下,数据库引擎使用行级锁来处理并发读写操作。行级锁允许多个事务同时读取同一表中的不同行,但当一个事务修改某一行时,它会获取写锁,阻塞其他事务对该行的写操作,从而保证数据的一致性。
  2. 快照读取: 为了保证读操作的一致性,数据库引擎会使用快照读取。当一个事务开始时,它会创建一个一致性视图或快照,用于确定事务开始时数据库的快照状态。事务在读取数据时,会根据一致性视图获取对应的数据版本,避免读取到其他事务未提交的数据。

具体实现时,已提交读隔离级别下的事务使用一致性读取(Consistent Read)或当前读取(Current Read)。在一致性读取中,事务读取数据时会根据一致性视图获取数据的版本。这样可以确保读取的数据版本与事务开始时的一致性视图一致,避免脏读和不可重复读。而在当前读取中,事务读取数据时会直接获取最新的数据版本,而不考虑其他事务的并发操作。

需要注意的是,已提交读隔离级别仍然存在幻读(Phantom Read)的问题。幻读指的是在同一事务中,对于相同的查询条件,不同的查询结果可能会发生变化。这是因为在事务执行期间,其他事务可能插入或删除了满足查询条件的数据。为了解决幻读问题,可以使用更高的隔离级别,如可重复读或串行化,或者采用锁机制或多版本并发控制(MVCC)等技术来处理。

总的来说,已提交读隔离级别通过行级锁和快照读取机制来实现事务的隔离性和一致性。它允许事务读取其他已提交事务的数据,并通过锁机制和快照读取来保证读操作的一致性。

3.可重复读是如何实现的?

可重复读(Repeatable Read)是数据库中的一种隔离级别,它的实现主要通过以下几个机制:

  1. 一致性读取: 在可重复读隔离级别下,事务在开始时创建一个一致性视图(Consistent View),用于确定事务开始时数据库的快照。事务在整个执行过程中,都会使用这个一致性视图来读取数据。一致性读取保证了事务读取的数据与事务开始时的一致性视图一致,即使其他事务对数据进行了修改或提交。
  2. 行级锁: 为了处理并发冲突,可重复读隔离级别使用行级锁来锁定事务涉及的数据行。当一个事务对某一行进行写操作时,会获取对应数据行的写锁,这会阻塞其他事务对同一行的写操作。这样可以保证在事务执行期间,其他事务不能修改被当前事务读取的数据。
  3. 快照读取: 可重复读隔离级别下的事务使用快照读取来保证读操作的一致性。快照读取是指事务读取数据时,根据一致性视图获取对应的数据版本。事务在读取数据时,会读取与其一致性视图相符的数据版本,即使其他事务修改了数据,事务读取的数据版本也不会发生变化。
  4. 可重复读锁定: 在可重复读隔离级别下,事务会对读取的数据行进行锁定,以防止其他事务对这些行进行更新。这种锁定可以确保在整个事务执行期间,被锁定的数据行不会被其他事务修改。

通过以上机制,可重复读隔离级别可以提供一致性的读操作和隔离性。事务读取数据时,使用一致性视图获取数据版本,避免了脏读和不可重复读的问题。行级锁和快照读取机制确保了事务读取的数据在整个事务执行期间保持一致。这使得多次读取同一数据时,读取结果是相同的。

需要注意的是,可重复读隔离级别仍然可能出现幻读(Phantom Read)的问题。幻读是指在同一事务中,对于相同的查询条件,不同的查询结果可能会发生变化。为了解决幻读问题,可重复读隔离级别可能使用额外的锁或MVCC来处理。这样可以在事务执行期间锁定满足查询条件的数据行,或使用快照读取来保证查询的一致性。

总结起来,可重复读隔离级别通过一致性视图、行级锁和快照读取来实现事务的隔离性和一致性。它允许事务读取其他已提交事务的数据,并通过锁机制和快照读取来保证读操作的一致性。

4.可串行化是如何实现的?

可串行化(Serializable)是数据库中最高的隔离级别,它的实现主要通过以下两种方法之一:

  1. 锁机制: 可串行化隔离级别可以使用锁机制来实现。当一个事务对数据进行读或写操作时,会获取相应的锁,阻塞其他事务对同一数据的并发读写。这样可以确保事务之间的串行执行,避免并发冲突和数据不一致的问题。常见的锁包括行级锁、表级锁、页级锁等,具体实现方式会根据数据库系统而有所不同。
  2. 多版本并发控制(MVCC): 可串行化隔离级别也可以使用多版本并发控制(MVCC)来实现。MVCC允许事务在读取数据时,不会受到其他事务并发修改的影响。每个事务在开始时创建一个一致性视图,用于确定事务开始时数据库的快照。当其他事务对数据进行修改时,MVCC会创建新的数据版本,并将新版本与旧版本进行关联。这样,事务在读取数据时可以根据自己的一致性视图获取相应的数据版本,从而实现读操作的一致性和隔离性。

无论是使用锁机制还是MVCC,可串行化隔离级别都通过阻塞并发事务或使用数据版本来实现事务的串行执行。这样可以避免并发冲突、脏读、不可重复读和幻读等问题。然而,由于可串行化隔离级别严格限制了并发性,因此在高并发环境下,可能会影响数据库的性能和吞吐量。

需要注意的是,可串行化隔离级别可能导致死锁的情况发生。当多个事务相互等待对方持有的锁时,可能会导致死锁的发生,从而导致事务无法继续执行。数据库系统通常会使用死锁检测和死锁解决机制来处理这种情况,如超时机制、死锁检测算法和死锁回滚等。

总结起来,可串行化隔离级别通过锁机制或MVCC来实现事务的隔离性和一致性。它确保事务的串行执行,避免并发冲突和数据不一致,但同时也会带来较高的开销和性能影响。在选择隔离级别时,需要综合考虑应用的并发性和一致性要求,并根据具体场景选择适当的隔离级别。

5.可串行化和可重复读的区别

可串行化和可重复读是数据库中的两种隔离级别,它们之间有以下区别:

  1. 隔离级别的严格性: 可串行化是最高的隔离级别,确保事务的串行执行,事务之间完全隔离。而可重复读是较低的隔离级别,在事务执行期间可以读取其他事务已提交的数据,但保证了在同一事务中多次读取同一数据时的一致性。
  2. 并发冲突处理方式: 可串行化隔离级别使用锁机制或多版本并发控制(MVCC)来处理并发冲突。它会阻塞其他事务对同一数据的并发读写操作,从而保证事务的串行执行。而可重复读隔离级别通过快照读取和行级锁来处理并发冲突,允许并发读取,但当一个事务修改数据时,会阻塞其他事务对该数据的写操作。
  3. 读取一致性的保证: 在可串行化隔离级别下,读操作获得的数据是事务开始时的一致性视图。这意味着在整个事务期间,读取的数据保持一致,不受其他事务修改的影响。而在可重复读隔离级别下,读操作也使用一致性视图,但允许其他事务对数据进行修改,只要这些修改在事务开始时之前提交即可。
  4. 幻读的处理: 幻读是指在同一事务中,对相同的查询条件进行多次查询,结果集可能会出现不一致的情况。在可串行化隔离级别下,通过锁或MVCC可以避免幻读的发生。而在可重复读隔离级别下,通过快照读取和行级锁可以防止幻读的发生。

查询,结果集可能会出现不一致的情况。在可串行化隔离级别下,通过锁或MVCC可以避免幻读的发生。而在可重复读隔离级别下,通过快照读取和行级锁可以防止幻读的发生。

总体来说,可串行化是最严格的隔离级别,保证了事务的串行执行和数据的完全隔离。它通过锁机制或MVCC来处理并发冲突,提供了最高的数据一致性和隔离性。可重复读是较低的隔离级别,允许并发读取,但通过快照读取和行级锁来提供读操作的一致性。在选择隔离级别时,需要根据具体的业务需求和并发访问模式来权衡一致性和性能的要求。

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

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

相关文章

解决报错:FUNC glfwErrorCallback GLX: Failed to create context: GLXBadFBConfig

解决报错:FUNC glfwErrorCallback GLX: Failed to create context: GLXBadFBConfig 执行glxinfo | grep OpenGL命令查看系统中的OpenGL信息时,显示以下信息: 根据得到的信息可以看到 OpenGL core profile version string 为 4.5 说明显卡驱…

基于web的考研信息交流平台/考研信息分享平台的设计与实现

摘 要 随着信息化时代的到来,管理系统都趋向于智能化、系统化,考研信息交流平台也不例外,但目前国内的有些平台仍然都使用人工管理,浏览网站人数越来越多,同时信息量也越来越庞大,人工管理显然已无法应对时…

【复杂系统】拥抱复杂性(第 2 部分数据)

如何通过三个简单(ish)步骤将您的组织网络化……从数据开始 您的信息不想被困在一个盒子里 在本文的第一部分中,我们确定了工业时代将复杂性组织成漂亮、整洁的线性盒子,尽管这是一种高效的机器制造方式,但这种方法已不…

cucumber基于BBD的自动化测试

1.1 BDD介绍 行为驱动开发(Behavior Driven Development,BDD)简历在测试驱动开发的基础上,并且优化了很多TDD实践者的良好习惯。BDD可以通过自然语言来描写自动化测试,增加自动化的可阅读性. 1.2 cucumber原理 reshen目前有很多BDD的框架&a…

达观曹植大模型正式对外公测!专注于长文本、多语言、垂直化发展

大模型时代到来,国内出现“百模大战”的局面。达观数据自23年3月宣布研发大语言模型以来,一直积极探索大语言模型的专业化、特长化和产品化。通过多年的高质量数据积累,不断精进算法创新,结合多年的文本处理工程实践经验&#xff…

【C】自定义类型详解

自定义类型 结构体结构体类型声明特殊的声明 结构的自引用结构体的定义和初始化结构体的内存对齐为什么存在内存对齐呢?修改默认的对齐参数 结构体传参位段位段的内存分配位段的跨平台问题 枚举枚举类型的定义枚举的优点枚举的使用 联合(共用体&#xff…

刷题记录03

题目一. 具体思路: 这里就是,一个简单的解方程的一个思路,首先我们要理清楚,这道题,这里面的思路 A-Ba B-Cb ABc BCd 由上面的关系得出下面的解 A(a c)/2 B1(bd)/2 B2(c-a)/2 C(b-d)/2 具体代码: import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信…

maven-依赖管理-上

依赖管理 依赖配置 一句话: 依赖指当前项目运行需要的jar&#xff0c;一个项目可以设置多个依赖 依赖的举例 <!-- 解读: 1. 这里就是引入项目需要的jar 包, 类似传统的import jar 的作用 2. 在dependencies 标签内&#xff0c;可以指定多个需要依赖的jar/导入的jar 3. 引…

Skywalking 9.4部署监控Java应用链路跟踪

资源地址&#xff1a; github地址&#xff1a;GitHub - apache/skywalking: APM, Application Performance Monitoring System java agent下载地址&#xff1a;Index of /dist/skywalking/java-agent 一.监控架构图 二.使用docker-compose启动skywalking以及ES version: 3.3…

字符函数和内存函数 (一)

目录 一、strlen函数 1.1strlen函数的认识 1.2strlen函数的模拟实现 二、strcpy函数 2.1strcpy函数的认识 2.2strcpy函数的模拟实现 三、strcat函数 3.1strcat函数的认识 3.2strcat函数的模拟实现 四、strcmp函数 4.1strcmp函数的认识 4.2strcmp函数的模拟实现 五、…

Java 面试知识点

Java 面试知识点 Java基础知识1. 一个".java"源文件中是否可以包括多个类&#xff08;不是内部类&#xff09;&#xff1f;有什么限制&#xff1f;2. 说说&和&&的区别。3.在 JAVA 中如何跳出当前的多重嵌套循环&#xff1f;4.switch 语句能否作用在 byte…

使用uni-popup踩坑记录

使用uni-popup时发现遮罩层并不生效&#xff0c;找了很多方法都没解决。。。直到快要自己封装一个组件的时候&#xff0c;打开uni-popup源码看了一眼 uni-popup里还使用了uni-transition组件&#xff0c;这一点官方文档上有提到&#xff08;但是我选择性失明了。。&#xff09;…

02 |「新建项目」

前言 新建项目 文章目录 前言一、步骤二、结构3. Java 文件夹4. res 文件夹5. Gradle Scripts文件三、运行流程四、Gradle 构建项目1. 是什么2. 作用一、步骤 1)New Project 2)Empty Activity 3)Finsh 选项: Name:项

Orangepi Zero2 基于官方外设开发(一)

目录 一、wiringPi外设SDK安装 二、蜂鸣器 补充&#xff1a;shell脚本的改进 补充&#xff1a;vim缩进 三、超声波测距模块 四、SG90舵机 五、Linux定时器 一、wiringPi外设SDK安装 第一种&#xff1a; git clone https : //github.com/orangepi-xunlong/wiringOP // 下载源…

python_day7_map

绘制简易地图 导包 import jsonfrom pyecharts.charts import Map from pyecharts.options import *准备地图对象 map Map()准备数据 data [("新疆维吾尔自治区", 99),("黑龙江省", 199),("江苏省", 299),("辽宁省", 399),(&quo…

我不是培训班的,但建议上IT培训班

目录 一、个人经历 二、有哪些IT培训班 三、学习IT上培训班的益处 四、学习IT上培训班的风险 五、就业前景 六、题外话 在学习IT技术的过程中&#xff0c;你是否也被安利过各种五花八门的技术培训班&#xff1f;这些培训班都是怎样向你宣传的&#xff0c;你又对此抱有着…

MyBatis 的架构

MyBatis 的架构 MyBatis 是一个基于 Java 的持久层框架&#xff0c;可以将 SQL 语句和 Java 代码进行分离&#xff0c;通过 XML 或注解的方式配置 SQL 语句并执行&#xff0c;从而实现数据访问的功能。MyBatis 的架构包括以下几个部分&#xff1a; SqlSessionFactory&#xff…

vue前端下载打开文件

<a href"/static/template/公告导入人员模板.xlsx" id"downloadTemplate" style"">下载模版</a>vue前端下载打开文件

D. Rating System

Problem - D - Codeforces 思路&#xff1a;我们先将输入数据做一个前缀和&#xff0c;能够得到它的变化&#xff0c;然后我们能够发现我们只需要找到两个点&#xff0c;第一个点-第二个点最大即可&#xff0c;因为假如说我们现在到了一峰 // Problem: D. Rating System // Con…

想成为合格的嵌入式系统开发工程师需要具备的技能

嵌入式行业中&#xff0c;看到大神开发一个程序非常简单&#xff0c;而自己却只能开发一些简单的小程序&#xff0c;从而就引起了自己的仰慕之心&#xff0c;心想自己什么时候才能达到这样的水平。作为一名大神级别的嵌入式系统开发工程师&#xff0c;他们自身所具备的技能是非…