mysql 默认事务隔离级别_MySQL 事务隔离级别详解

35c293ad62e6c1383b51cd85dca43e1f.png
个人公众号『码农札记』,欢迎关注,查看更多精彩文章。
简介: MySQL的事务隔离级别一共有四个,分别是读未提交、读已提交、可重复读以及可串行化。

四个特性ACID

原子性 (Atomicity)

事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。例如,如果一个事务需要新增 100 条记录,但是在新增了 10 条记录之后就失败了,那么数据库将回滚对这 10 条新增的记录。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。

一致性 (Consistency)

指事务将数据库从一种状态转变为另一种一致的的状态。事务开始前和结束后,数据库的完整性约束没有被破坏。例如工号带有唯一属性,如果经过一个修改工号的事务后,工号变的非唯一了,则表明一致性遭到了破坏。

隔离性 (Isolation)

要求每个读写事务的对象对其他事务的操作对象能互相分离,即该事务提交前对其他事务不可见。 也可以理解为多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其它事务运行效果。这指的是在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。由并发事务所做的修改必须与任何其他并发事务所做的修改隔离。例如一个用户在更新自己的个人信息的同时,是不能看到系统管理员也在更新该用户的个人信息(此时更新事务还未提交)。

注:MySQL 通过锁机制来保证事务的隔离性。

持久性 (Durability)

事务一旦提交,则其结果就是永久性的。即使发生宕机的故障,数据库也能将数据恢复,也就是说事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。这只是从事务本身的角度来保证,排除 RDBMS(关系型数据库管理系统,例如 Oracle、MySQL 等)本身发生的故障。

注:MySQL 使用 redo log 来保证事务的持久性。

四种隔离级别

READ UNCOMMITTED(未提交读)

一个事务还没提交时,它做的变更就能被别的事务看到。 事务可以读取未提交的数据,这也被称为脏读(Dirty Read)

READ COMMITTED(读提交)

一个事务提交之后,它做的变更才会被其他事务看到。 一个事务从开启事务到提交事务之前,对其他事务都是不可见的,因此在同一个事务中的两次相同查询结果可能不一样。故这种隔离级别有时候也叫不可重复读(NONREPEATABLE READ)

REPEATABLE READ(可重复读)

一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。 当然在可重复读隔离级别下,未提交变更对其他事务也是不可见的。

SERIALIZABLE(可串行化)

顾名思义是对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当 出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。

幻读

上文对脏读,不可重复读概念都进行了详细介绍,还有一种现象叫做幻读,概念如下:

幻读是针对数据插入(INSERT)操作来说的。假设事务A对某些行的内容作了更改,但是还未提交,此时事务B插入了与事务A更改前的记录相同的记录行,并且在事务A提交之前先提交了,而这时,在事务A中查询,会发现好像刚刚的更改对于某些数据未起作用,但其实是事务B刚插入进来的,让用户感觉很魔幻,感觉出现了幻觉,这就叫幻读

汇总

raft-node="block" data-draft-type="table" data-size="normal" data-row-style="striped">

隔离级别脏读不可重复读幻读读未提交yesyesyes读提交noyesyes可重复读nonoyes可重复读nonono

举个栗子

假设数据表 T 中只有一列,其中一行的值为 1,下面是按照时间顺序执行两个事务的行为。

mysql> create table T(c int) engine=InnoDB;
insert into T(c) values(1);
事务A事务B
启动事务 查询得到值1启动事务
查询值为1
将1更新成2
查询值为V1
提交事务B
查询值为V2
提交事务A
查询值为V3

若隔离级别是读未提交: 则 V1 的值就是 2。这时候事务 B 虽然还没有提交,但是结果已经被 A 看到了。因此,V2、V3 也都是 2。

若隔离级别是读提交: 则 V1 是 1,V2 的值是 2。事务 B 的更新在提交后才能被 A看到。所以, V3 的值也是 2。

若隔离级别是可重复读: 则 V1、V2 是 1,V3 是 2。之所以 V2 还是 1,遵循的就是这个要求:事务在执行期间看到的数据前后必须是一致的。

若隔离级别是串行化: 则在事务 B 执行“将 1 改成 2”的时候,会被锁住。直到事务 A 提交后,事务 B 才可以继续执行。所以从 A 的角度看, V1、V2 值是 1,V3 的值是 2。

可以看到在不同的隔离级别下,数据库行为是有所不同的。Oracle 数据库的默认隔离级别其实就是“读提交”,因此对于一些从 Oracle 迁移到 MySQL 的应用,为保证数据库隔离级别的一致,你一定要记得将 MySQL 的隔离级别设置为“读提交”。 配置的方式是,将启动参数 transaction-isolation 的值设置成 READ-COMMITTED。 你可以用 show variables 来查看当前的值。

mysql> show variables like 'transaction_isolation';
+-----------------------+----------------+
| Variable_name | Value |
+-----------------------+----------------+
| transaction_isolation | READ-COMMITTED |
+-----------------------+----------------+

总结来说,存在即合理,哪个隔离级别都有它自己的使用场景,你要根据自己的业务情况 来定。那什么时候需要“可重复读”的场景呢?我们来看一个数据校对逻辑的案例。

假设你在管理一个个人银行账户表。一个表存了每个月月底的余额,一个表存了账单明细。这时候你要做数据校对,也就是判断上个月的余额和当前余额的差额,是否与本月的账单明细一致。你一定希望在校对过程中,即使有用户发生了一笔新的交易,也不影响你的校对结果。 这时候使用“可重复读”隔离级别就很方便。事务启动时的视图可以认为是静态的,不受其他事务更新的影响。

小结

MySQL 的 InnoDB 引擎才支持事务,其中可重复读是默认的隔离级别。 读未提交和串行化基本上是不需要考虑的隔离级别,前者不加锁限制,后者相当于单线程执行,效率太差。 读提交解决了脏读问题,行锁解决了并发更新的问题。 本文主要介绍四种隔离级别和产生的问题,下一篇文章会深入解析隔离级别的实现原理MVCC和解决幻读的Next-Key 锁实现。

http://weixin.qq.com/r/gRPA2OrEK7dUra6790aT (二维码自动识别)

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

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

相关文章

如何在 Asp.Net Core 中对请求进行限流

译文链接:https://www.infoworld.com/article/3442946/how-to-implement-rate-limiting-in-aspnet-core.html在应用程序开发时,或许你有这样的想法,控制用户的请求频率来防止一些用户的恶意攻击,具体的说就是:为了预防…

算法设计与分析——动态规划——石子合并问题

1.石子合并问题 在一个圆形操场的四周摆放着n堆石子。现要将石子有序地合并成一堆。规定每次只能选相邻的2堆石子合并成新的一堆&#xff0c;并将新的一堆石子数记为该次合并的得分。设计一个算法&#xff0c;计算出将n堆石子合并成一堆的最小得分和最大得分。 #include<st…

软件层面可以做到重启本地串口吗_手机关机还是重启好?get这几招,手机更流畅...

遇到手机卡顿&#xff0c;很多人都会不自觉的选择重启手机&#xff0c;还是不行&#xff0c;就关机等一会儿再开机&#xff0c;这样几次下来手机真的就顺畅多了。那么关机和重启到底有什么区别&#xff1f;还有哪些方法可以保持手机流畅&#xff1f;跟着小编来了解一下&#xf…

在传统行业做数字化转型之团队篇

【数字化转型】| 作者 / Edison Zhou这是EdisonTalk的第309篇原创内容在过去的两年时间里&#xff0c;我加入了一家传统行业的企业参与其数字化转型的过程&#xff0c;现在我将我的经历分享出来&#xff0c;本文是第四部分—团队篇&#xff0c;主要会介绍一下我所在的经济适用型…

回顾 | 进击吧! Blazor!系列

Blazor 是一个 Web UI 框架&#xff0c;可通过 WebAssembly 在任意浏览器中运行 .Net 。Blazor 旨在简化快速的单页面 .Net 浏览器应用的构建过程&#xff0c;它虽然使用了诸如 CSS 和 HTML 之类的 Web 技术&#xff0c;但它使用 C&#xff03;语言和 Razor 语法代替 JavaScrip…

算法设计与分析——回溯法——旅行售货员问题

#include<iostream> #include<bits/stdc.h> using namespace std; const int noEdge65535; class Traveling {public:void BackTrack(int i);int n; //图G的顶点数 int *x; //当前的解 int *bestx; // 当前的最优解 int **a; // 图G的临界矩阵 int cc; //…

sql不等于0怎么表示_数组真的只能从0开始吗?python表示不同意

背景早在linux操作系统诞生开始&#xff0c;c语言作为linux系统的编程语言主力&#xff0c;它为后续的其他高级编程语言(如c、java)提供了很多语言级的语义和协议规范。数组做为linux操作系统最基本的数据结构之一&#xff0c;便是其中的一项语言级高级特性&#xff0c;深入理解…

ASP.NET Core 5.0新增功能摘要

.NET5.0发布了大半个月&#xff0c;从.NET Core3.1的平滑迁移体验令人心旷神怡&#xff0c;改个targetframework就完成迁移&#xff0c;不要太轻松&#xff01;然而&#xff0c;ASP.NET Core5.0也有很多有意思的改变&#xff0c;这里为大家摘录一下&#xff01;内置swagger在 A…

算法设计与分析——回溯法——圆排列问题

#include<iostream> #include<math.h> using namespace std; class Circle {public:float Center(int t);void Compute(void );void BackTrack(int t);float min; //当前最优值 float *x; //当前圆排列圆心横坐标 float *r; //当前圆排列 float *result; /…

数字图像处理王伟强_深度学习主导下,还有必要学数字图像处理?

图像处理技术作为计算机视觉的基础&#xff0c;通过计算机对图像进行去除噪声增强、复原、分割、提取特征等处理的方法和技术。多用于目标检测与目标识别等领域。>>数字图像处理、CV、CG与AI四者的关系图<<随着计算机视觉的迅速发展&#xff0c;基于深度学习的研究…

算法设计与分析——贪心算法——单个出水口打水问题

1.打水问题&#xff1a;有n个人去水房排队打水&#xff0c;只有一个出水口&#xff0c;且出水口流速恒定。每个人因为盛水的工具不一&#xff0c;打水所需的时间也不一致&#xff0c;设第i个人所需要的打水时间为ti&#xff1b;问如何安排打水顺序使得所有人的平均等待时间最短…

在传统行业做数字化转型之最终篇

【数字化转型】| 作者 / Edison Zhou这是EdisonTalk的第310篇原创内容在过去的两年时间里&#xff0c;我加入了一家传统行业的企业参与其数字化转型的过程&#xff0c;现在我将我的经历分享出来&#xff0c;本文是最终篇&#xff0c;主要会回答中途一些网友的问题以及推荐一些参…

算法设计与分析——贪心算法——汽车加油问题

汽车加油问题&#xff1a;一辆汽车加满油后可行驶n公里&#xff0c;旅途中有若干个加油站&#xff0c;两加油站间距离不超n 公里&#xff0c;起点离第一个加油站距离及最后一个加油站离终点距离也不超过n公里。算法给出应在哪些加油站停靠加油&#xff0c;使沿途加油次数最少。…

.NET Conf China 2020志愿者招募火热开启!还有神秘惊喜等你来领…

距.NET Conf China 2020 2020 中国 .NET 开发者大会开幕还有14天作为.NET的组织者之一我们已经为这个活动准备铺垫了很久但为了保证活动方方面面的质量为了给现场&线下的小伙伴们带来更好的体验现在&#xff01;我们十分需要你们的帮助&#xff01;为更好地做好大会服务工作…

golang 修改nginx配置文件_「系统架构」Nginx调优,不可错过的几点

通常&#xff0c;Nginx在安装完后&#xff0c;不用更改任何配置信息&#xff0c;我们就可以直接运行它。但是&#xff0c;这显然不能满足我们的生产要求。在生产中&#xff0c;要让Nginx能正常高效地运行我们的应用&#xff0c;我们通常需要对Nginx的配置文件进行一些参数上的设…

如何在 C# 中使用 Attribute

译文链接&#xff1a;https://www.infoworld.com/article/3006630/how-to-work-with-attributes-in-c.html?nsdrtrueAttribute 在 C# 中是一个非常强大的特性&#xff0c;它能够给你的程序集添加元数据信息。Attribute 实际上是一个对象&#xff0c;它可以与以下元素中的任何一…

readyread信号不触发_触发器型PFD与传统型PFD性能仿真对比

&#xfeff;TOC 鉴频鉴相器中为了保证鉴相范围&#xff0c;主要有两种PFD可以在理想情况下实现 到 的鉴相范围。 传统的PFD和边沿触发型的PFD1.电路结构1.1传统型电路结构参考文献&#xff1a;宽带CMOS分数频率合成器的研究与实现——黄福青 东南大学博士论文 1.2 触发器型电路…

算法设计与分析——分治与递归——整数划分问题

将正整数n表示为一系列正整数之和&#xff0c; nn1n2n3n4......nk &#xff08;其中&#xff0c;n1>n2>n3>n4........>nk>0,k>1&#xff09;正整数n的这种表示成为正整数n的划分。正整数n的不同划分个数成为正整数n的划分数&#xff0c;记作p&#xff08;n…

跟我一起学Redis之Redis持久化必知必会

前言Redis是出了名的速度快&#xff0c;那是因为在内存中进行数据存储和操作&#xff1b;如果仅仅是在内存中进行数据存储&#xff0c;那就会导致以下问题&#xff1a;•数据随进程退出而消失&#xff1a;当服务器断电或Redis Server进程退出时&#xff0c;内存肯定随之释放&am…

算法设计与分析——分支限界法——装载问题

有一批共个集装箱要装上2艘载重量分别为C1和C2的轮船&#xff0c;其中集装箱i的重量为Wi&#xff0c;且装载问题要求确定是否有一个合理的装载方案可将这个集装箱装上这2艘轮船。如果有&#xff0c;找出一种装载方案。 容易证明&#xff1a;如果一个给定装载问题有解&#xff…