事务隔离级别

MySQL事务隔离级别 本文主要探讨MySQL事务隔离级别的使用,具体什么场景使用啥,实战验证出现的并发事务问题 阅读详情

事务的 ACID

事务具有四个特征:原子性( Atomicity )、一致性( Consistency )、隔离性( Isolation )和持续性( Durability )。这四个特性简称为 ACID 特性。

1 、原子性。事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做

2 、一致性。事 务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统 运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是 不一致的状态。

3 、隔离性。一个事务的执行不能其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。

4 、持续性。也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。

Mysql的四种隔离级别

  • Read Uncommitted(读取未提交内容)

  • Read Committed(读取提交内容)

  • Repeatable Read(可重读)

  • Serializable(可串行化)

  • 脏读(Drity Read):某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的。

  • 不可重复读(Non-repeatable read):在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据。

  • 幻读(Phantom Read):在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。

-- 查看表结构
desc tb_test;
-- 客户端A: 将A的会话隔离级别设置为read uncommitted(未提交读)
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
​
-- A 查看全局 / 会话事务隔离级别
    -- mysql 5
SELECT @@global.tx_isolation, @@tx_isolation;
    -- mysql 8 
SELECT @@global.transaction_isolation,@@transaction_isolation;
​
# 设定全局的隔离级别 设定会话 global 替换为 session 即可 把set语法温习一下
# SET [GLOABL] config_name = 'foobar';
# SET @@[session|global].config_name = 'foobar';
# SELECT @@[global.]config_name;
SET @@gloabl.tx_isolation = 0;
SET @@gloabl.tx_isolation = 'READ-UNCOMMITTED';
​
SET @@gloabl.tx_isolation = 1;
SET @@gloabl.tx_isolation = 'READ-COMMITTED';
​
SET @@gloabl.tx_isolation = 2;
SET @@gloabl.tx_isolation = 'REPEATABLE-READ';
​
SET @@gloabl.tx_isolation = 3;
SET @@gloabl.tx_isolation = 'SERIALIZABLE';

1.未提交度导致的脏读数据

测试SQL:

-- A 启动事务更新数据,不提交
START TRANSACTION;
​
-- A 查询数据: (数据为初始状态)
SELECT * FROM tb_test;
​
-- ---->>>转客户端-B
​
-- A 再次查询数据:  发现数据已经被修改了,这就是所谓的“脏读”
SELECT * FROM tb_test;
​
-- ---->>>转客户端-B
​
-- A 再次读取数据,发现数据变回初始状态
SELECT * FROM tb_test;
-- 客户端B: 启动事务
START TRANSACTION;
-- B 更新数据:不提交
UPDATE tb_test SET num = 10 WHERE id = 1;
-- ---->>>转客户端-A
COMMIT;
 -- OR
ROLLBACK;
-- ---->>>转客户端-A

事务B更新了一条记录,但是没有提交,此时事务A可以查询出未提交记录。造成脏读现象。未提交读是最低的隔离级别。

2.已提交读导致的不可重复读

-- 客户端A: 将A的会话隔离级别设置为read committed(已提交读)
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

测试SQL:

-- A 启动事务更新数据,不提交
START TRANSACTION;
​
-- A 查询数据: (数据为初始状态)
SELECT * FROM tb_test;
​
-- ---->>>转客户端-B
​
-- A 再次查询数据:  发现数据未被修改
SELECT * FROM tb_test;
​
-- ---->>>转客户端-B
​
-- A 再次读取数据:发现数据已发生变化,说明B提交的修改被事务中的A读到了,这就是所谓的“不可重复读”
SELECT * FROM tb_test;
-- 客户端B: 启动事务
START TRANSACTION;
-- B 更新数据:不提交
UPDATE tb_test SET num = 10 WHERE id = 1;
-- ---->>>转客户端-A
COMMIT;
 -- OR
ROLLBACK;
-- ---->>>转客户端-A

已提交读隔离级别解决了脏读的问题,但是出现了不可重复读的问题,即事务A在两次查询的数据不一致,因为在两次查询之间事务B更新了一条数据。已提交读只允许读取已提交的记录,但不要求可重复读。

3.可重复读级别导致的幻读

-- 客户端A: 将A的会话隔离级别设置为read committed(已提交读)
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

幻读错误的理解:说幻读是 事务A 执行两次 select 操作得到不同的数据集,即 select 1 得到 10 条记录,select 2 得到 11 条记录。这其实并不是幻读,这是不可重复读的一种,只会在 R-U R-C 级别下出现,而在 mysql 默认的 RR 隔离级别是不会出现的。

幻读,并不是说两次读取获取的结果集不同,幻读侧重的方面是某一次的 select 操作得到的结果所表征的数据状态无法支撑后续的业务操作。更为具体一些:select 某记录是否存在,不存在,准备插入此记录,但执行 insert 时发现此记录已存在,无法插入,此时就发生了幻读。

# step-1:开启A客户端事务,并且查询(没有数据)
BEGIN;
select *from tb_test where id = 9
# step-2: 开启B客户端事务,插入一条数据,提交事务
BEGIN;
insert into tb_test values(9,999);
COMMIT;
# step-3:再次查询该条数据(没有显示初B客户端提交的数据,出现了幻读),且尝试insert该ID的数据(出现主键冲突)
select *from tb_test where id = 9
insert into tb_test values(9,999);

RR 也是可以避免幻读的,通过对 select 操作手动加 行X锁(SELECT ... FOR UPDATE 这也正是 SERIALIZABLE 隔离级别下会隐式为你做的事情),同时还需要知道,即便当前记录不存在,比如 id = 1 是不存在的,当前事务也会获得一把记录锁(因为InnoDB的行锁锁定的是索引,故记录实体存在与否没关系,存在就加 行X锁,不存在就加 next-key lock间隙X锁),其他事务则无法插入此索引的记录,故杜绝了幻读。

# 这里需要用 X锁, 用 LOCK IN SHARE MODE 拿到 S锁 后我们没办法做 写操作
SELECT `id` FROM `users` WHERE `id` = 1 FOR UPDATE;

4.可串行化

-- 客户端A: 将A的会话隔离级别设置为SERIALIZABLE(串行化)
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;

serializable完全锁定字段,若一个事务来查询同一份数据就必须等待,直到前一个事务完成并解除锁定为止。是完整的隔离级别,会锁定对应的数据表格,因而会有效率的问题。

在 SERIALIZABLE 隔离级别下,step1 执行时是会隐式的添加 行(X)锁 / gap(X)锁的,从而 step2 会被阻塞,step3 会正常执行,待 T1 提交后,T2 才能继续执行(主键冲突执行失败),对于 T1 来说业务是正确的,成功的阻塞扼杀了扰乱业务的T2,对于T1来说他前期读取的结果是可以支撑其后续业务的。

id = 1 的记录不存在,开始执行事务: step1: T1 查询 id = 1 的记录并对其加 X锁 step2: T2 插入 id = 1 的记录,被阻塞 step3: T1 插入 id = 1 的记录,成功执行(T2 依然被阻塞中),T1 提交(T2 唤醒但主键冲突执行错误)。

T1事务符合业务需求成功执行,T2干扰T1失败。

# step-1:开启A客户端事务,并且查询(没有数据),加X锁
BEGIN;
select *from tb_test where id = 9 for update;
# step-2: 开启B客户端事务,插入一条数据,会出现“主键冲突的提示”
BEGIN;
insert into tb_test values(9,999);
# step-3:A客户端insert该ID的数据(正常)
insert into tb_test values(9,999);
commit;

(参考:https://segmentfault.com/a/1190000016566788?utm_source=tag-newest)

VASP计算层错能(SFE)全攻略2 本文介绍了使用VASP计算纯镍(Ni)层错能(SFE)的具体步骤。首先构建Ni的FCC单胞并扩展为超胞,通过修改原子位置引入堆垛层错;随后分别计算完美晶体和含层错结构的能量;最后通过能量差与层错面积之比求得SFE值。计算需注意k点网格、截断能和超胞尺寸的收敛性测试,并推荐使用PAW赝势和ASE等工具辅助结构构建。 阅读详情

相关推荐

RFSOC实战解析(一):深入RF Data Converter的时钟与数据接口设计

本文深入解析RFSOC中RF Data Converter的时钟与数据接口设计,涵盖GHz采样、数据流处理、时钟树同步及AXI-Stream接口实战。通过详细案例和调试技巧,帮助工程师高效配置IP核,优化ADC/DAC性能,解决跨时钟域和信号完整性等关键问题。

weixin_30955617的博客 473

关于Spring Batch—Step批处理框架汇总介绍及使用

SpringBatch 介绍 在SpringBatch 中 Job是step的运行框架 ,而具体的运行业务是由step进行完成 Step 下图就是Step的简要构造 一个Step通常涵盖三个部分:读数据(Reader)、处理数据(Processor)和写数据(Writer)。但是并不是所有的Step都需要自身来完成数据的处理,比如存储过程等方式是通过外部功能来完成,因此Spring Batch提供了2种Step的处理方式: 1)面向分片的ChunkStep, 2)面向过程的TaskletStep。 一般

CHANGJIATENG的博客 1917

液态神经网络系列(四) | 一条 PyTorch 从零搭建 LTC 细胞

本文详细介绍了如何从零开始用PyTorch实现Liquid Time-constant Networks(LTC)神经元模型。首先将LTC的核心微分方程拆解为输入电导、系统时间常数和数值积分器三个模块,然后逐步构建LTCCell类,包括物理参数初始化、突触参数设置和前向演化过程。文章还展示了如何封装LTCModel处理不规则时间序列,并通过正弦波抗干扰实验验证了LTC模型的优越性。最后讨论了数值稳定性、计算代价等实现细节,并预告了下一篇将探讨使用伴随灵敏度算法优化显存占用的方法。

wyj333333的博客 2067

MySQL 事物四种隔离级别分析

ACID是事务的四大特性(Atomicity原子性一致性隔离性持久性),其实主要是事务具备隔离性,隔离性能够保证各个线程在运行期间不会相互影响,独自完成各自的事情,有了隔离性也就能保证程序的原子性,就可以让一个线程相当于串行的执行业务逻辑,有了事物的原子性,从而可以保证数据的一致性,最后把一致性数据以一种B+Tree数据结构持久化到磁盘,这就是事物四大特性,可以看见隔离性是个重量级单位,今天我们就来分析下I(Isolation)也就是事物的4种隔离级别。1、原子性(Atomicity)......

龚小帅的博客 1550

Unreal5从入门到精通之一文搞懂Unreal的C++代码编译之谜

我们在开发Unreal项目时,如果时蓝图模板的项目,一般问题不大,因为当你修改完蓝图,点击编译Compile+保存Save,就可以继续开发了。这对于开发者来说也非常友好。但是,如果你使用的C++模板开发项目,代码编译一切都变得魔幻起来,IDE(VS/Rider)里面有编译,编辑器里面也有编译,有什么区别呢?我们来列举几个新手常碰到的问题。1.代码我明明新建了,编辑器里怎么看不到?2.昨天我新家的功能运行的好好的,今天怎么感觉还是老逻辑。或者昨天加的新代码,新蓝图不见了。

TxNet 1606

FAST-LIVO2 源码精读(十六):接入自定义传感器——多雷达适配与内外参标定

本文是「FAST-LIVO2 激光-惯性-视觉里程计源码精读」专栏第十六篇。上一篇拆解了中每个关键参数的物理含义与调参路径,并反复强调外参RclPcl与时间偏移配错即全局失效;本篇承接这一悬念,回答更前置的工程问题——如何把 FAST-LIVO2 接到一套全新硬件上:新雷达如何通过的类型分支适配、相机内参与畸变模型如何配置、两组外参与时间偏移如何标定出来并填入 YAML,最后给出一份落地检查清单。

PX4-SLAM-PNC 199

Spring Batch(5): Step详解

面向chunk处理 1 抽象Step与继承 2 commit interval 3 重启 4 跳过 5 重试 6 事务属性与回滚 7 在Step中注册ItemStream流 8 拦截Step执行 TaskletStep 控制Step执行流程 1 next 2 flow 3 JobStep 在Step中结束Job 1 end 2 fail 3 stop Late Binding与StepJob sc

Spring , Hadoop, Spark , BI , ML 2万+

手把手教你学Simulink——基于Simulink的CLLC谐振变换器双向对称控制

本文介绍了一种基于Simulink的CLLC谐振变换器双向对称控制方法。针对CLLC拓扑的多阶谐振特性,采用固定频率、50%占空比、仅调节相位差的对称控制策略,实现了宽电压范围调节和全负载ZVS软开关。详细阐述了Simulink建模步骤,包括功率级搭建、相位差生成逻辑和双向切换实现,并通过仿真验证了稳态性能和双向无缝切换能力。该方法解决了传统PFM控制的不足,具有控制简单、效率高、易于工程实现的优势,适用于车载充电和储能系统等双向功率应用场景。

MHD0815的博客 302

mysql事物4大隔离级别,隔离级别如何修改。

mysql事物的隔离级别: mysql innodb存储引擎实现SQL标准的4种隔离级别,用来限定事物内外的哪些是可见的,哪些是不可见的,低级别的事物一般支持更高的并发处理,并拥有更低的系统开销。 show variables like ‘tx_isolation’; ±--------------±----------------+ | Variable_name | Value ...

weixin_40524659的博客 505

图像处理入门007:图像处理中的数学基础:线性代数与卷积

一种:把 OpenCV 当黑盒,调用,效果不对就乱调参数;另一种:理解每个像素是怎么被周围邻域"加权平均"的,理解核翻转、边界填充、stride 的含义。前者能干活,后者能解难题。一旦遇到自定义核(比如 ISP 上的锐化)、深度学习反向传播、医学图像重建,你就必须把卷积、相关、矩阵乘法这些基本功捡回来。线性代数三件套:向量点积、矩阵乘法、线性变换;2D 卷积的数学定义:核翻转、滑动窗口、边界填充。并手写一个,验证它与和的结果完全一致(误差 < 1e-9)。f∗gn∑m−∞∞f。

专注:太空算力、AI infra、异构调度、大模型成本工程 387

【AIGC】大模型面试高频考点09-大模型Agent框架

聚焦AIGC专业技术分享

一个内容严谨、方向前沿、极具实践价值的AI大模型技术分享站 1967

事务的隔离级别

事务的隔离级别 事务的四大特性分别是:原子性、一致性、隔离性、持久性 幻读和不可重复读都是在同一个事务中多次读取了其他事务已经提交的事务的数据导致每次读取的数据不一致,所不同的是不可重复读读取的是同一条数据,而幻读针对的是一批数据整体的统计(比如数据的个数) 以MYSQL数据库来分析四种隔离级别 第一种隔离级别:Read uncommitted(读未提交) 如果一个事务已经开始写数据,则另外一个事...

zhouym_的博客 16万+

【WRFDA运行第五期】运行 OBSGRID 客观分析

运行 OBSGRID 客观分析

WW、forever的博客 1048

【MySQL事务】事务的隔离级别

正在进行中且尚未提交。

2301_80224556的博客 2120

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Spring事务隔离级别详解

Spring事务隔离级别详解

嗨,欢迎来到我的 优快云 博客小天地!一名深耕多年的技术发烧友。在这里,我将把日常工作中积累的宝贵经验,从复杂架构设计的精妙之处,到代码优化的实战技巧,毫无保留地分享给大家。 2829

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

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

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

Yeeear的博客 1073

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Spring 有几种事务隔离级别?

事务隔离级别是对事务 4 大特性中隔离性的具体体现,使用事务隔离级别可以控制并发事务在同时执行时的某种行为。比如,有两个事务同时操作同一张表,此时有一个事务修改了这张表的数据,但尚未提交事务,那么在另一个事务中,要不要(或者说能不能)看到其他事务尚未提交的数据呢?这个问题的答案就要看事务的隔离级别了,不同的事务隔离级别,对应的行为模式也是不一样的(有些隔离级别可以看到其他事务尚未提交的数据,有些事务隔离级别看不到其他事务尚未提交的数据),这就是事务隔离级别的作用。

知识分享官 1万+

什么是事务和事务隔离级别

什么是事务 事务是访问数据库的一个操作序列,数据库应用系统通过事务集来完成对数据库的存取。事务的正确执行使得数据库从一种状态转换为另一种状态。 事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability)的缩写,这四种状态的意思是: 1、原子性 即不可分割,事务要么全部被执行,要么全部不执行。如果事务的所有子事务全部提交成功,则所有的数据库操作被提交,数据库状态发生变化;如果有子事务失败

weixin_44953227的博客 5742

事务的隔离级别有哪些

按隔离水平高低排序如下:针对不同的隔离级别,并发事务时可能发生的现象也会不同。接下来,举个具体的例子来说明这四种隔离级别,有一张账户余额表,里面有一条账户余额为 100 万的记录。然后有两个并发的事务,事务 A 只负责查询余额,事务 B 则会将我的余额改成 200 万,下面是按照时间顺序执行两个事务的行为:这四种隔离级别具体是如何实现的呢?

qq_74475840的博客 942

事务的4种隔离级别

当多个线程都开启事务操作数据库中的数据时,数据库系统要能进行隔离操作,以保证各个线程获取数据的准确性,所以,对于不同的事务,采用不同的隔离级别会有不同的结果。 如果不考虑事务的隔离性,那么会发生下表所示的3种问题: 不可重复读是由于事务并发修改同一条记录导致的,要避免这种情况,最简单的方法就是对要修改的记录加锁,这会导致锁竞争加剧,影响性能。另一种方法是通过MVCC可以在无锁的情况下,避免不可重复读。 幻读是由于并发事务增加记录导致的,这个不能像不可重复读通...

song_myth的博客 9244

关于事务及事务隔离级别的详细讲解

什么是事务 事务是访问数据库的一个操作序列,数据库应用系统通过事务集来完成对数据库的存取。事务的正确执行使得数据库从一种状态转换为另一种状态。 事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability)的缩写,这四种状态的意思是: 1、原子性 即不可分割,事务要么全部被执行,要么全部不执行。如果事务的所有子事务全部提交成功,则所有的数据库操作被提交,数据库状态发生变化;如果有子

君子慎独,不欺暗室;卑以自牧,不欺于心 2883

mysql事务隔离级别

隔离级别 MySQL是一个服务器/客户端架构的软件,对于同一个服务器来说,可以有若干个客户端与之连接,每个客户端与服务器连接上之后,就可以称之为一个会话(Session)。我们可以同时在不同的会话里输入各种语句,这些语句可以作为事务的一部分进行处理。不同的会话可以同时发送请求,也就是说服务器可能同时在处理多个事务,这样子就会导致不同的事务可能同时访问到相同的记录。我们前边说过事务有一个特性称之为...

laozhang0910的博客 8296

Spring事务的隔离级别

事务隔离级别

weixin_61518137的博客 2122

事务的四种隔离级别

目录1.数据库事务的隔离级别 1.数据库事务的隔离级别 由低到高分别有四种; 1.read uncommitted:读未提交,即一个事务可以读取另一个未提交事务的数据; 出现问题: 脏读:事务A读取到了事务B中未提交的数据,当事务B回滚后,事务A读取到的数据都是脏数据; 老板要给程序员发工资,程序员的工资是3.6万/月。但是发工资时老板不小心按错了数字,按成3.9万/月,该钱已经打到程序员...

107 9821

Spring 事务的隔离级别

Spring 事务的隔离级别

weixin_46619605的博客 1709
下一篇: Spring事务管理之事务传播
AlgebraFly
博客等级 码龄9年 260粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AlgebraFly

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值