MYSQL事务隔离级别

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

mysql有4种事务隔离级别,分别为:read uncommited(读未提交数据)
read commited(读已提交数据) ,repeatable read(可重复读) 和 serializable(串行化)。其默认隔离级别为为repeatable read。这些隔离级别是为了解决同时运行多个事务时,当这些事务访问数据库中相同的数据时引发的并发问题。一般有三种:脏读,不可重复读,幻读,在下面对应的隔离级别中会 解释这些问题。并且随着隔离级别的升级,会慢慢解决这些并发问题。

设置隔离级别:set session transaction isolation level 隔离级别
查看当前隔离级别:select @@tx_isolation

在详细叙述每种隔离级别之前, 先做对四种隔离级别一个总结:

  1. READ UNCOMMITTED:一个事务在提交之前,对其他事务是可见的,即事务可以读取未提交的数据。存在“脏读”(读到了脏数据)问题;
  2. READ COMMITTED:事务在提交之前,对其它事务是不可见的。存在“不可重复读”(两次查询的得到的结果可能不同,即可能在查询的间隙,有事务提交了修改)问题。解决了“脏读”问题。
  3. REPEATABLE READ:在同一事务中多次读取的数据是一致的。解决了脏读和不可重复读问题,存在“幻读”(在事务两次查询间隙,有其他事务又插入或删除了新的记录)。— MySQL默认隔离级别。
  4. SERIALIZABLE:强制事务串行化执行。即一个事物一个事物挨个来执行,可以解决上述所有问题。

①隔离级别为read uncommitted,啥都解决不了

如图,我设置当前隔离级别为read uncommited,这是最低级别的隔离。意思是在事务中做了update,insert或者delete操作,事务未提交时,在另外一个窗口查看该表,可以得到实时数据更新。

接下来我往表中插入数据,字段为id和money,插入3条数据

接下来我开启事务,并将 A的money从100更新为150,C的money从300更新到250 (id,money为字段名)。但是,我此时并未rollback或者commit,也就是我处于未提交状态。

那么,我新开了一个窗口,同样操作,开启一个新的事务,并设置相同的隔离级别,注意:这个很重要,如果没有设置相同的隔离级别,就无法实现。

可以看到,我在另一个窗口查看未提交的事务中所做的改变,可以得到相同的结果,也就是说:read uncommited隔离级别就如字面意思,可读取未提交的数据。顺带提一下,这种情况也称为 脏读,意思是对于两个事务t1,t2,当t1去读取已经被t2更新但是却未提交的数据时,可以读取到,若此时t2回滚,t1读取到的就是无效的。比如下图,我执行回滚,然后再去另一个窗口查看:

另一个窗口的事务:

很明显,再次读取时,money并未改变,因为我已经rollback了,所以这些update操作是无效的。 注意:这种隔离级别是最低的,会出现很多并发问题。

②隔离级别为read committed,解决脏读

意思是读已提交的数据,同样从字面意思理解:就是当事务发生update,insert或者delete操作,但还未提交的时候,另一个事务去读取这个表的数据,是无法读取实时更新的数据的。
如下图,还是干一样的事情,把A的money更新成150,C的money更新成250,然后我先不提交,在另一个窗口来读取这个表,看看能不能得到新的A的money和新的C的money

另一个窗口如下,很明显,我还没提交事务,且隔离级别为read committed,所以读不到更新后的,也就是解决了“脏读”问题。

接下来我commit一下,看看结果是不是可以读到更新,很明显可以了。

另一个窗口的事务:

总结一下:上面这种情况叫做不可重复读,其定义为:对于t1,t2两个事务,t1去读取已经被t2更新了但是还没提交的数据,得到一个值,然后t2提交后,t1再去读同一个数据,又得到一个值,这两个值是不同的。
那我们要解决“不可重复读”的问题,就需要继续升级隔离级别,看下面。

③ 隔离级别为repeatable read,解决脏读,不可重复读

意思是可重复读,如下图,我把A的money更新成1000,并在另一个窗口的事务来查看。

可以发现我还没提交之前,没有出现“脏读”情况,money并未改变。

接下来我在第一个事务那里commit,然后在另一个窗口中的事务继续查看,发现还是没改变,这就解决了“不可重复读”问题。

接下来我把另一个窗口的事务也提交了,再次查询可以发现money已经改变了,这就是 隔离级别为repeatable read(可重复读),可以解决脏读、不可重复读问题。

④隔离级别为serializable(串行化)。啥都能解决,但是效率低

幻读:事务t1对一个表中的数据进行了修改,比如这种修改涉及到表中的“全部数据行”。同时,事务t2也修改这个表中的数据,这种修改是向表中插入“一行新数据”。那么,操作事务t1的用户就会发现表中还存在没有修改的数据行,就好象发生了幻觉一样(嗯?我不是已经修改了全部数据行了吗?怎么还存在一个新数据行修改不到呢?)
比如下图,我开启一个事务,并打算将所有money设置为300,我的表只有3行数据。
然后同样的,我在另一个窗口开启一个新事务,然后新增一行数据。
在这里插入图片描述
需要注意:如果隔离级别是serializable,当在事务1中进行update操作,并且还未提交的时候,在另一个事务2中做insert操作,会阻塞在insert语句(由于我没有为任何字段创建索引,而innodb存储引擎在索引失效时会由行锁(默认)变为表锁,所以另一个事务会被阻塞)。如果隔离级别不是serializable而出现“幻读”,那么这个时候左图的update执行完后,显示的应该是Change:4。
而现在我设置隔离级别是serializable,就解决了“幻读“的问题。
在这里插入图片描述
总结一下:对于同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,会导致各种并发问题,比如上面提到的 脏读、不可重复读、幻读等等。举个例子,说两个事务并发执行,访问同一块数据,当事务1想要update,事务2想要insert,好的情况就是事务1干完update就提交,只有事务1提交完了,事务2才可以insert。这样避免上面提到的三种并发问题,而只有最高级别的serializable才可以做到,而且因为存在阻塞,所以效率并不高。也因此mysql的默认隔离级别是第三种repeatable read。

,

MySQL事务隔离级别详解 全局事务要求在其中的所有参与的事务要么都提交,要么都回滚,这对于事务原有的 ACID 要求又有了提高。解决幻读的方式有很多,但是它们的核心思想就是一个事务在操作某张表数据的时候,另外一个事务不允许新增或者删除这张表中的数据了。从上面对 SQL 标准定义了四个隔离级别的介绍可以看出,标准的 SQL 隔离级别定义里,REPEATABLE-READ(可重复读)是不可以防止幻读的。还是刚才上面的读已提交的图,虽然避免了读未提交,但是却出现了,一个事务还没有结束,就发生了 不可重复读问题。并不会有任何性能损失。 阅读详情

相关推荐

深入解析MySQL事务隔离级别及其实现原理

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

fudaihb的博客 2424

MySQL事务隔离级别详解(全网最详细)

在关系型数据库中,事务隔离级别是指多个并发事务之间的隔离程度MySQL 中事务的隔离级别一共分为四种,分别如下READ-UNCOMMITTED(读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。READ-COMMITTED(读取已提交): 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。REPEATABLE-READ(可重复读)

qq_53868937的博客 1万+

AI驱动全栈开发实战:基于Spec与Codex的规格驱动开发指南

1. 先搞清楚“AI重构前端全栈”到底在解决什么实际问题 最近很多人在聊“AI重构前端全栈”,听起来像是又一个营销概念。但如果你真的拆开看,它核心解决的是一个非常具体且痛苦的问题: 一个开发者,如何从零开始,系统性地、不跑偏地完成一个完整项目,并且保证代码质量和架构一致性。 传统开发流程里,产品经理出PRD,前后端开会对齐,前端画页面,后端写接口,测试再介入。这个过程沟通成本高,文档容易过时,新人上手慢。而“AI重构”的思路,是试图用一套 规范化的指令(Spec) 来驱动AI(比如Codex这类模型)生成代

weixin_30596023的博客 459

mysql事务隔离级别

mysql事务隔离级别

xinyuan的专栏 1万+

RK3588上从零部署Facenet人脸识别:PyTorch转ONNX再到RKNN的完整避坑指南

本文提供了在RK3588开发板上从零部署Facenet人脸识别模型的完整指南。详细介绍了从PyTorch模型导出、转换为ONNX格式,再通过RKNN-Toolkit2转换为RKNN格式的完整流程,并重点分享了环境配置、算子兼容性处理、量化调优及板端部署中的关键步骤与避坑经验。

river的博客 462

Windows 2012 SYSVOL复制失败的处理

题外话:晓原理、知架构、查日志是排错的三件法宝今天在DC1上新建并链接了一个组策略对像,在客户端刷新时,却报下面的错误:“处理组策略失败。Windows无法应用组策略对象LDAP….”如下图所示:于是在客户端用\\domain.com访问,发现\\domain.com\SYSVOL\domain.com\policies下面没有上面报错的组策略对象。这是怎么一回事呢,pin...

weixin_33989780的博客 1669

Mysql 是如何解决幻读问题的?

虽然 InnoDB 中通过间隙锁的方式解决了幻读问题,但是加锁之后一定会影响到并发性能,因此,如果对性能要求较高的业务场景中,可以把隔离级别设置成 RC,这个级别中不存在间隙锁。好了,今天的分享就到这里,如果你在面试中遇到了比较奇葩的问题,欢迎在评论区留言。

sinat_53467514的博客 1889

手把手教你用示波器测试DDR5 DRAM信号完整性(附眼图分析技巧)

本文详细介绍了如何使用示波器测试DDR5 DRAM信号完整性,包括眼图分析技巧。从DDR5的核心挑战、测试设备选型到实测工作流程,提供了全面的指导。特别强调了DFE功能验证和系统级协同测试,帮助工程师解决信号完整性问题,提升测试效率。

g2h3i4j5的博客 1149

MySQL中的事务隔离级别有哪些

可能发生脏读、不可重复读、幻读,性能最高但安全性最低。:防止脏读,但可能发生不可重复读和幻读。REPEATABLE READ(MySQL 默认):防止脏读和不可重复读,MySQL 还能避免幻读,适用于大多数高并发业务。:所有并发问题都能避免,但性能最差。MySQL 默认采用,主要是因为 MySQL 通过MVCC解决了大部分的并发问题,既能保持较高的事务隔离级别,又不会影响太多的性能。读未提交(Read Uncommitted)该级别允许事务读取其他事务尚未提交的数据(脏读)。

Weiki的博客 5116

使用LSTM实现自动调制识别(RML2018.01a)

目录一、LSTM的代码实现1.1 导入包1.2 数据读取及数据集划分1.3 数据预处理1.4 构建LSTM模型 本文基于RML2018.01a大型数据集,给出LSTM的信号识别的实现方式(附代码) RML2018.01a数据集信息如下: 模型 传送门 CNN/ResNet 使用CNN/ResNet实现自动调制识别(RML2018.01a) LSTM 使用LSTM实现自动调制识别(RML2018.01a)) 一、LSTM的代码实现 1.1 导入包 import numpy as np

QAQIknow的博客 6121

OpenRubrics:自动化评估工具优化LLM对齐效果

在大型语言模型(LLM)应用中,模型输出与人类价值观的对齐是关键挑战。传统人工反馈强化学习(RLHF)依赖大量标注,成本高且一致性差。OpenRubrics作为开源工具,通过结构化准则实现自动化评估,显著提升效率。其核心原理是将主观评价转化为可量化的多维指标,支持动态权重调整,并兼容主流RLHF框架。该工具在降低标注成本的同时,通过Fleiss' Kappa系数等指标保证评估一致性,适用于多语言和医疗等专业领域,为LLM对齐提供了工程化解决方案。

weixin_28730037的博客 357

【MySql】MySql事务及隔离级别

MySql事务隔离级别

酷酷的馫博客 1万+

IPD流程中的RR\OR\IR\PB\SR\AR\CR等名词汇总(基于新的产品包需求架构)

RR:Raw Requirement,原始需求=》IR:Initial Requirement,初始需求=》SR:System Requirement,系统需求=》AR:Allocated Requirement,分配需求=》CR:Process Change Requirement,流程变更需求。

a1809032425的博客 3186

MySQL 事务四大特性和事务隔离级别

MySQL 事务具有四个特性:原子性、一致性、隔离性、持久性,这四个特性简称 ACID 特性一、原子性(Atomicity ):一个事务是一个不可再分割的整体,要么全部成功,要么全部失败事务在数据库中就是一个基本的工作单位,事务中包含的逻辑操作(SQL 语句),只有两种情况:成功和失败。事务的原子性其实指的就是这个逻辑操作过程具有原子性,不会出现有的逻辑操作成功,有的逻辑操作失败这种情况二、一致性(Consistency ):一个事务可以让数据从一种一致状态切换到另一种一致性状态举例说明:张三给李四转账 1

辰风沐阳 1万+

【WRF-FDDA】观测 Obs nudging 的配置与使用说明(中)

WRF-FDDA

WW、forever的博客 280

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

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

正在进行中且尚未提交。

2301_80224556的博客 2120

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【MySQL进阶之路】事务的隔离级别

其中隔离级别越严格,安全性越高,但数据库的并发性能也就越低,往往需要在两者之间找一个平 衡点。不可重复读的重点是修改和删除:同样的条件, 你读取过的数据,再次读取出来发现值不一样了幻读的重点在于新增:同样的条件, 第1次和第2次读出来的记录数不一样说明: mysql 默认的隔离级别是可重复读,一般情况下不要修改 上面的例子可以看出,事务也有长短事务这样的概念。事务间互相影响,指的是事务在并行执行的 时候,即都没有commit的时候,影响会比较大。隔离级别描述可能出现的问题。

2301_79796701的博客 2089

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

MySql中的事务、MySql事务详解、MySql隔离级别

思考:我去银行给朋友汇款,我卡上有100元,朋友卡上50元,我给朋友转账50元,如果我的钱刚扣,而朋友的钱又没加时,网线断了, 怎么办(Transaction)是数据库管理系统(DBMS)中的一个核心概念,它确保了一系列数据库操作要么全部成功,要么全部失败,从而维护数据库的完整性和一致性。MySQL在5.5版本开始,就将InnoDB引擎作为默认存储引擎。由于Mysql中的事务是存储引擎实现,而且只有InnoDB支持事务。

m0_74825526的博客 1113

MySQL 事务隔离级别_mysql事务隔离级别最高

❝如果隔离级别为序列化,则用户之间通过一个接一个顺序地执行当前的事务,这种隔离级别提供了事务之间最大限度的隔离。❝在可重复读在这一隔离级别上,事务不会被看成是一个序列。不过,当前正在执行事务的变化仍然不能被外部看到,也就是说,如果用户在另外一个事务中执行同条 SELECT 语句数次,结果总是相同的。(因为正在执行的事务所产生的数据变化不能被外部看到)。❝READ COMMITTED 隔离级别的安全性比 REPEATABLE READ 隔离级别的安全性要差。

2501_90392009的博客 1669

MySql事务隔离级别

序列化可重复读提交读未提交读幻读:两个事务,当事务A(READ COMMITTED 事务任意都行),事务B(REPEATABLE READ) ,当事务A提交执行了开始事务操作,但是未对数据进行操作;事务B此时也同步开启了事务,但是只是查询了一下数据;而事务A在此时对数据进行了操作,并提交了。在事务B中还是读取之前的数据,导致在操作数据的时候出现了异常现象;这个就好理解了,当事务AREAD COMMITTED,事务B(事务任意都行);当事务A开始事务之后,查询了数据;

qq_43070052的博客 970

MySQL的事务隔离级别

事务隔离级别是数据库中确保数据一致性和完整性的关键要素。从最宽松的"读未提交"到最严格的"串行化",每个隔离级别都有其独特的特点和优劣势。"读未提交"允许脏数据读取,但性能较高,适用于不要求数据完整性的场景。"读已提交"解决了脏读问题,但仍可能出现不可重复读。"可重复读"提供更高程度的隔离,避免了不可重复读问题,但仍可能发生幻读。而"串行化"则是最高级别,绝对确保数据的完整性,但可能带来性能开销。选择适当的隔离级别应根据应用需求权衡数据一致性与性能,确保数据库操作正确且数据完整。

m0_62468521的博客 2384

MySQL事务与事务的隔离级别

事务是指一组SQL语句的集合,集合中有多条SQL语句,可以是insert、update、select、delete,希望这些SQL语句执行是一致的,作为一个整体执行。:对于两个事务T1,T2,T1从一个表中读取了一个字段,T2修改该字段并提交后,T1仍然读取到的是上第一次读取的值。:在事务并发执行时,他们内部的操作互补干扰(指的是互不影响执行,事务执行后,数据的结果取决于事务的隔离级别)。:当前事务的操作要么同时成功,要么同时失败。,数据库规定了多种事务的隔离级别,不同隔离级别对应不同的干扰程度,

陌守 8048

MySQL事务的四大隔离级别

MySQL事务的四大隔离级别事务什么是事务?事务的四大特性事务并发存在的问题脏读(dirty read)不可重复读(unrepeatable read)幻读事务的四大隔离级别实践读未提交(Read Uncommitted)读已提交(READ COMMITTED)可重复读(Repeatable Read)串行化(Serializable)MySql隔离级别的实现原理读未提交(Read Uncommi...

@龙猫的博客 4147
上一篇: windows下select服务器模型
下一篇: 回溯递归思想的一些经典算法题
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值