回顾数据库事务中的隔离性

深入解析MySQL事务隔离级别及其实现原理 在数据库管理系统中,事务(Transaction)是保证数据一致性的重要机制。而事务隔离级别则是决定多个事务之间如何相互影响的关键。MySQL作为常用的关系型数据库,其事务隔离级别和实现机制在许多业务场景中起着至关重要的作用。本文将详细介绍MySQL的事务隔离级别、常见问题及其底层实现原理,帮助读者更好地理解和应用事务。 阅读详情

一 概述

        提到事务,你肯定会想到 ACID(Atomicity、Consistency、Isolation、Durability,即原子性、一致性、隔离性、持久性),今天我们就来说说其中 I,也就是“隔离性”。当数据库上有多个事务同时执行的时候,就可能出现脏读(dirty read)、不可重复读(non-repeatable read)、幻读(phantom read)的问题,为了解决这些问题,就有了“隔离级别”的概念。

        Atomicity(原子性):一个事务(transaction)中的所有操作,或者全部完成,或者全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。即,事务不可分割、不可约简。

        Consistency(一致性):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设约束、触发器、级联回滚等。

        Isolation(隔离性):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。

        Durability(持久性):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

二 数据库事务的隔离性

        事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。

  1. 读未提交是指,一个事务还没提交时,它做的变更就能被别的事务看到。
  2. 读提交是指,一个事务提交之后,它做的变更才会被其他事务看到。
  3. 可重复读是指,一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。当然在可重复读隔离级别下,未提交的变更对其他事务也是不可见的。
  4. 串行化,顾名思义是对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。

三 如何理解"读提交"和"可重复读"

 不同隔离级别下的结果:

  1. 若隔离级别是“读未提交”, 则 V1 的值就是 2。这时候事务 B 虽然还没有提交,但是结果已经被 A 看到了。因此,V2、V3 也都是 2。
  2. 若隔离级别是“读提交”,则 V1 是 1,V2 的值是 2。事务 B 的更新在提交后才能被 A 看到。所以, V3 的值也是 2。
  3. 若隔离级别是“可重复读”,则 V1、V2 是 1,V3 是 2。之所以 V2 还是 1,遵循的就是这个要求:事务在执行期间看到的数据前后必须是一致的。
  4. 若隔离级别是“串行化”,则在事务 B 执行“将 1 改成 2”的时候,会被锁住。直到事务 A 提交后,事务 B 才可以继续执行。所以从 A 的角度看, V1、V2 值是 1,V3 的值是 2。

四 视图的概念

        RC(读提交)级别下,MVCC视图会在每一个语句前创建一个,所以在RC级别下,一个事务是可以看到另外一个事务已经提交的内容,因为它在每一次查询之前都会重新给予最新的数据创建一个新的MVCC视图,即在每一行SQL语句执行的时候创建。

        RR(可重复读)级别下,MVCC视图实在开始事务的时候就创建好了,这个视图会一直使用,直到该事务结束。 这里要注意不同的隔离级别他们的一致性事务视图创建的时间点是不同的,即在事务启动的时候创建。

        RU(读未提交)级别下,没有视图的概念,直接返回最小行数据。

        Serial(串行化)级别下,通过锁来实现数据访问,没有视图的概念。

        总结:有上述总结可知,不同的事务在实现上,数据库里面会创建一个视图,访问的时候以视图的逻辑结果为准。在“可重复读”隔离级别下,这个视图是在事务启动时创建的,整个事务存在期间都用这个视图。在“读提交”隔离级别下,这个视图是在每个 SQL 语句开始执行的时候创建的。这里需要注意的是,“读未提交”隔离级别下直接返回记录上的最新值,没有视图概念;而“串行化”隔离级别下直接用加锁的方式来避免并行访问。

Vivado SDK中LWIP库版本冲突与RTL8211FDI兼容性实战解析 本文深入解析Vivado 2019.1 SDK中LWIP 1.0库与RTL8211FDI千兆PHY芯片的版本冲突问题,并提供实战解决方案。通过手动移植高版本LWIP库、整合第三方驱动及优化BSP配置,有效解决了以太网通信兼容性问题,确保千兆性能稳定运行。 阅读详情

相关推荐

MATLAB实战:手把手教你实现Gardner环路位同步(附完整代码)

本文通过MATLAB实战,详细讲解了Gardner环路位同步算法的原理与实现。内容涵盖插值滤波器、定时误差检测、环路滤波器与数控振荡器等核心模块,并提供完整代码和调试技巧,帮助读者掌握数字通信中关键的符号定时同步技术。

weixin_29048775的博客 175

MySQL: 事务的隔离级别

一、事务的四种个隔离级别 我们都知道事务的ACID(Atomicity、Consistency、Isolation、Durability,即原子性、一致性、隔离性、持久性)四个特性,当数据库上有多个事务同时执行的时候,就可能出现脏读(dirty read)、不可重复读(non-repeatable read)、幻读(phantom read)的问题,为了解决这些问题,就有了“隔离...

sayoko06的博客 321

别再只调A*算法了!聊聊ROS机器人导航中,OpenCV视觉信息如何与激光雷达数据“打配合”

本文探讨了ROS机器人导航中激光雷达与OpenCV视觉融合的实战策略,揭示了如何通过多模态感知提升导航精度。文章详细介绍了视觉特征到代价地图的转化方法、系统级挑战的工程解决方案,以及融合感知下的路径规划进化,帮助开发者优化机器人导航系统。

weixin_29278805的博客 226

数据库事务的四大特性及事务隔离级别

概要: 事务的四个特性:原子性、一致性、隔离性、持久性 事务不隔离带来的问题:更新丢失、脏读、不可重复读、虚读(幻读)。其中更新丢失就是并发写,这是一定不允许的,因此一定要解决更新丢失问题。 事务隔离的级别:读未提交(1000)、读已提交(1100)、可重复读(1110)、串行化(1111)。 更新丢失 脏读 不...

Evan's Blog ٩(๑❛ᴗ❛๑)۶ 1万+

告别代码恐惧!用KRobot图形化编程,10分钟搞定Arduino巡线小车(附完整接线图)

本文介绍如何使用KRobot图形化编程工具快速搭建Arduino巡线小车,无需编写代码。从硬件准备到逻辑构建,详细讲解传感器数据处理、电机控制优化及高级功能扩展,帮助教育工作者和创客爱好者10分钟内完成项目。

weixin_30632089的博客 395

Trae CN 使用入门指南

【代码】Trae CN 使用入门指南。

weixin_42551921的博客 8771

数据库的事务四大特性(ACID)、详解隔离性以及隔离级别、锁

本文介绍了数据库事务的四大特性(ACID):原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),并详细探讨了隔离性的不同级别及其可能引发的问题(脏读、不可重复读、幻读)。MySQL默认隔离级别为可重复读(Repeatable read),而Oracle仅支持串行化(Serializable)和读已提交(Read committed)。文章还提供了查看和修改隔离级别的常用SQL命令,强调了事务开始与结束的操作方式,帮助开发者理解事务的实

weixin_48053866的博客 2万+

通信原理 | 窗函数 | 矩形窗 | 汉宁窗 | 汉明窗 | 布莱克曼窗 | 补零对频谱的影响

比如,原信号是一个周期的余弦信号,又给它补了9个周期长度的0,那么信号并不是10个周期的余弦信号,而是一个周期的余弦加一串0,补零并没有带来新的信息!频谱分辨率的含义是两个频率不同的信号在频率上可分,也就要求他们不能落到一个频域函数的主瓣上,所以,如果待分析的两个信号频率接近,而时域长度又短,那么在频域上他们就落在一个频域函数的主瓣内了,补再多的零也无济于事。而形状(主瓣宽度)是由补零之前的信号长度决定的,补零的作用只是细化了频域序列,并没有改变其主瓣宽度。所以,汉宁窗牺牲了分辨率,换来了旁瓣泄露的减小。

若北辰 1305

数据库隔离性详解

隔离四特性 读未提交 (Read uncommitted):读到别人未提交的数据。 分析:出现脏读。Read committed!读提交,能解决脏读问题。 读提交(Read Committed):就是只能读到已经提交了的内容。 分析:若有事务对数据进行更新(UPDATE)操作时,读操作事务要等待这个更新操作事务提交后才能读取数据,可以解决脏读问题。但在这个事例中,出现了一个事务范围内两个相同的查询却返回了不同数据,这就是不可重复读。 可重复读(Repeated Read):专门针对“不可重复读”这种情况而制

weixin_39182190的博客 1370

基于物联网设计的蜂箱智能监测系统设计

为解决传统养蜂业依赖人工、管理效率低下、干扰蜂群等问题,本项目设计并实现了一套基于物联网(IoT)的蜂箱智能监测系统。

685

国产系统(统信 UOS )漏洞修复方式

2.1 服务器版(单漏洞更新):服务器标准版:yum upgrade-minimal --cve “CVE编号”服务器 D 版:sudo apt update&&sudo apt install “受影响的软件包”1 统信 UOS 漏洞修复方式在线升级修复桌面专业版:通过以下步骤打开在线升级:控制中心–>更新–>更新设置–>打开系统更新、安全更新。安装过程中,请勾选“我已阅读并知晓”,然后点击“开始升级”。2 点击“检查更新”–“全部下载”,如果不想进行系统更新,可以选择只下载“安全更新”。

Reyn_观极 5022

数据库四大特性及数据库隔离级别(*)

mysql隔离级别

weixin_42408447的博客 1001

[特殊字符] PetaLinux Qt 程序(WindRadar)无法自动启动问题解决文档

摘要:本文档解决了PetaLinux 2020.1系统中Qt程序(WindRadar)无法开机自动显示界面的问题。通过分析发现,自动启动时缺少DISPLAY=:0.0环境变量导致Qt找不到显示设备。最终在autostart.sh脚本中添加该变量,并完善了字体加载、驱动加载、显示设备检测等流程,确保程序正常自启显示界面。完整脚本包含路径检测、环境配置和错误处理,经验证各项功能均正常运行。

梁俊星的博客 328

事务前沿研究 | 隔离级别的追溯与究明,带你读懂 TiDB 的隔离级别(上篇)

上周六,在 Infra Meetup 134 期直播间,我们开启了「事务前沿研究」专题 Meetup 第一讲,希望通过本系列内容为大家分享一些学术前沿事务方面的研究内容。 在本次分享中,我司 TiDB 研发工程师童牧为大家介绍了事务隔离性基础概念与 TiDB 的隔离级别以及实现方式。为了让大家更好的理解分享内容,我们将发布「事务前沿研究」专题文章,本文将介绍在两阶段锁理解下,人们对隔离级别的理解。 绪论 「事务前沿研究」系列文章目的是给大家分享一些学术前沿的事务方面的研究内容,因为事务内容的专业性很强,本系

TiDB_PingCAP 的博客 4342

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

数据库事务学习回顾

数据库事务学习回顾 事务 谈到事务就一定要想到ACID: A:原子性 C:一致性 I :隔离性 D:持久性 原子性 原子性就是指一个事务是一个操作的最小单位,所以就要满足,要么这个事务的语句全部都执行,要么全部都不执行。假如一个事务执行到一般断电,那么如果没提交的话就回滚,变成事务未执行状态,如果已经提交了,就把没有做完的事情做完,变成事务执行结束状态。 总结为一句话:要么都执行,要么不执行。 一致性 一致性就是指一个事务在它执行的前后数据的完整性或者说是有效性是一致的。参考了别人的帖子,也有说是数据库

weixin_45795947的博客 227

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

分布式事务之深入理解什么是2PC、3PC及TCC协议?

导读 在上一篇文章《【分布式事务】基于RocketMQ搭建生产级消息集群?》中给大家介绍了基于RocketMQ如何搭建生产级消息集群。因为本系列文章最终的目的是介绍基于RocketMQ的事物消息来解决分布式系统中的数据一致性问题,所以先给大家率先介绍了RocketMQ消息集群的搭建。 原本是想着在这篇文章中直接介绍RocketMQ的事务消息特性,但是在梳理的过程中作者发现对于分布式事务的概念,可能...

无敌码农 1452

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Java开发两年:掌握这些知识点再也不怕面试通不过!成功拿到offer

前言 统一说明一下,楼主是研究生,一般的985毕业,之前在工作了6年,做过的大项目数不胜数, 比如再造淘宝项目落地实战,某滴网约车项目,多人在线即时对战网游服务器,和家云服务平台,前后端分离某喵微信商城,亿级流量多级缓存平台,亚马逊电商个性化推荐系统,IOT流云式平台,阿里巴巴中台实战,年初跳槽后去阿里面试6轮之后定级是P6。 什么是ACID? 事务的定义和实现一直随着数据管理的发展在演进,当计算机越来越强大,它们就能够被用来管理越来越多数据,最终,多个用户可以在一台计算机上共享数据,这就导致了一个问题,当

m0_56530263的博客 152

数据库基础知识

最近在回想之前面试的时候,  有些BT的面试官会问到自己一些比较基础的知识,比如什么是数据库,有几种范式==。 相信现在有好多人都把一些比较重要的基础知识都忘了吧,请问,数据库系统中事务需遵守什么原则==。 像这个问我记得当初回答时有回到到ACID  但是每个大写字母代表什么,还真心很难记住,这几天内心深处又在回忆了下,发现还是把它们给忘了,哎!! 数据库范式有好多种(第一范式,二范

jxlhc09的专栏 813

二阶段面试题总结

一.数据库里索引的作用 主要作用是为了提高查询效率,它的执行也是有一定条件的,不加索引就一定能够加快查询的效率,由于索引的创建是需要占据内存空间的,所以有些情况不适合加索引,如下: 1.如果每次都需要取到所有表记录,无论如何都必须进行全表扫描,那么是否加索引就没有意义了 2.队唯一的字段,例如"性别"这种大量重复值的字段,增加索引也没有意义 3.对于记录比较少的表,增加索引不会带来速度的优化反而浪费了存储空间,因为索引是需要存相互空间的,而且有个致命缺点就是对于update/insert/delet

lsj17635871332的博客 173

数据库事务隔离级别的总结

数据库隔离级别,脏读,幻读,不可重复读,RR隔离级别下的幻读问题

cab5的博客 2084

聊一聊数据库事务的四种隔离性及Oracle和MySQL各自的默认隔离级别及原因分析

【引言】 大家都知道数据库事务四特性:原子性、一致性、隔离性和持久性,也就是人们熟知的 ACID 特性。在实际生产应用中,数据库中的数据是要被多用户共享/访问,而在多个用户同时操作相同数据时,可能会出现一些事务的并发问题,这就就有了事务隔离性的四种不同级别。今天,本文将围绕事务的特性、并发问题、隔离级别进行集中学习。 之前的一篇相关推文介绍过MySQL的三种锁: 《浅谈MySQL三种锁:全局锁、表锁和行锁》点击查看 首先回顾下事物的概念: 一个事务中的一系列的处理操作操作要么全部成功,要么一个都不做。在数

db_murphy的博客 3045

如何看待分布式事务的隔离性?

分布式事务的,同时又能维持良好的,是一件非常困难的事情。

weixin_46072507的博客 538

【数据库】讨论事务中的隔离及立隔离级别

在探讨事务中的隔离之前,先回顾一下有关事务的基础概念 基本概念 数据库中的“事务处理”是什么? 这个问题的解答是我们探讨的基础,我们知道事务是数据库中哟一个单独的执行单元(Unit),它通常由高级数据库操纵语言(例如SQL)或编程语言(例如C++和Java等)编写的用户程序的执行所引起。当在数据库中更改数据成功时,在事务中更改的数据便会提交,不再改变。否则,事务就会取消或者回滚,使更改无效。 事务...

明月沉江春雾晓 2304

【Spring】事务的隔离级别,Spring的事务隔离级别和事务传播机制

本文回顾了MySQL的四种事务隔离级别(读未提交、读提交、可重复读、串行化),并介绍了Spring框架中的五种事务隔离级别和七种事务传播机制。MySQL的隔离级别解决了并发事务的数据一致性问题,而Spring的事务传播机制则处理了事务在方法调用间的传递行为。文章详细说明了每种传播机制的特点,如REQUIRED(默认)、REQUIRES_NEW(创建新事务)等,并通过源码展示了Spring中枚举类的实现方式。最后提到可以通过@Transactional注解的isolation和propagation属性来设置

Yeeear的博客 1078

数据库事务,spring事务,数据库连接池的回顾

(1)什么是连接池池(pool)技术在一定程度上可以明显优化服务器应用程序的性能,提高程序执行效率和降低资源开销。这里所说的是一种广义上的池,比如说数据库连接池,线程池,内存池,对象池等。其中,对象池可以看成保存对象的容器,在进行初始化的时候创建一定数量的对象,在需要的时候直接从池中取出一个空闲的对象,用完后并不直接释放对象,而是将对象放回对象池中以方便下一次对对象请求的复用。其中几种池的设计思想也是如此,池技术的优势是可以消除对象创建带来的延迟,从而提高系统性能。(2)为什么要使用连接池。

sp2ecter的博客 993

【Spring Boot】事务的隔离级别与事务的传播特性详解:如何在 Spring 中使用事务?不同隔离级别的区别?

事务这个词在学习 MySQL 和多线程并发编程的时候,想必大家或多或少接触过。那么什么是事务呢?事务是指一组操作作为一个不可分割的执行单元,要么全部成功执行,要么全部失败回滚。在数据库中,事务可以保证数据的一致性、完整性和稳定性,同时避免了数据的异常和不一致情况。常见的事务包括插入、更新、删除等数据库操作。事务的核心要素是ACID特性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。本文从事务及隔离级别以及事务传播机制分别讲解。

黄小黄的博客 7018
上一篇: 回顾查询数据库事务
下一篇: 回顾Join语句的优化
至学者
博客等级 码龄9年 180粉丝 773原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值