看完这篇文章,让你彻底理解事务隔离级别(读未提交、读已提交、可重复读、序列化)

本文主要是介绍看完这篇文章,让你彻底理解事务隔离级别(读未提交、读已提交、可重复读、序列化),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

对于不同的事务,采用不同的隔离级别分别有不同的现象。主要有下面3种:

1、脏读(dirty read):一个事务可以读取另一个尚未提交事务的修改数据。

2、不可重复读(nonrepeatable read)是指在数据库访问中,一个事务范围内两个相同的查询却返回了不同数据。

3、幻像读(phantom read):在同一事务中,同一查询多次进行时候,由于其他插入操作(insert)的事务提交,导致每次返回不同的结果集。

事务的隔离级别:

隔离级别脏读不可重复读幻读含义

read uncommitted(未提交读)

允许你读取别人未提交的事务,会出现脏读、幻读、不可重复读
read committed(读已提交)对事务已经提交的数据进行读取。解决了脏读。会出现幻读和不可重复度
repeatable read(重复读)在一个事务中。对相同字段条件读取数据都是一致的。但此类会出现幻读
serializable(序列化)完全服从数据库的ACID,不会出现幻读、不可重复读、脏读。但开启这类级别会非常消耗性能。它是典型的通过完全锁定在事务中涉及到数据库表的来完成的

其实针对文字性的东西。我们程序员不太好理解。就算理解了,过段时间也就忘了。所以还是要去做实验,让自己清楚。原来在这个场景下。这个概念 是这样的。

那让我们一起开启探索。mysql数据库的各个隔离级别的具体含义

准备两个窗口。一个修改数据的窗口,一个查询数据的窗口

1、read uncommitted 

模拟读未提交

首先设置数据库的隔离级别为读未提交

set  session transaction isolation level  read UNCOMMITTED

用命令 SELECT @@tx_isolation;查询下设置的级别

因为我是用navicat Premium工具连接的数据库。开启两个查询窗口(切记这两个查询窗口都需要设置隔离级别

在修改数据的窗口执行以下操作:

1、开启事务(begin)

2、修改数据disablestate设置为7。这时不要提交事务

3、用另个事务去查询数据,结果disablestate数据为7

果然读取到了,未提交的数据。所以也验证了未提交读。你修改了数据,但是事务还没来及提交。竟然被人家读取了

 2、read committed

按照同样的步骤。把数据库的隔离级别设置为读已提交

 set  session transaction isolation level read committed

 

在修改数据的窗口执行以下操作: 

1、开启事务(begin)

 2、修改数据设置disablestate为8

 update user_account set disablestate='8' where id='3';

此时还未提交事务。去另个窗口去查询下数据读取到的disablestate为7

 用了读已提交,不会读取到未提交的事务的数据。解决了脏读。但是不可重复读这个是什么呢?

看我的sql

 在一个事务中。读取两次。首先修改数据。不提交事务。执行第二行sql。

读取到disablestate为7。在修改的数据的窗口。提交事务,执行第三行sql

哦。数据变了。这就是所谓的不可重复读。在一个事务中。重复读取一条数据。出现了不同的结果 。解决不可重复读。当然用可重复读。

3、repeatable read

按照同样的步骤。把数据库的隔离级别设置为可重读

set  session transaction isolation level  REPEATABLE READ
 

在修改数据的窗口执行以下操作:

1、开启事务

2、修改数据。把disablestate设置为9,先不要提交事务

 在查询窗口中执行

两次查询都是之前的数据8。所以你理解了可重复读了吗?但是这个级别解决不了幻读。你get到了吗?用相同方法去尝试模拟幻读吧

序列化就不做过多演示了。序列化可以解决幻读。但是这个隔离级别性能消耗太大。基本不用 

这篇关于看完这篇文章,让你彻底理解事务隔离级别(读未提交、读已提交、可重复读、序列化)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/320255

相关文章

Oracle数据库使用 listagg去重删除重复数据的方法汇总

《Oracle数据库使用listagg去重删除重复数据的方法汇总》文章介绍了在Oracle数据库中使用LISTAGG和XMLAGG函数进行字符串聚合并去重的方法,包括去重聚合、使用XML解析和CLO... 目录案例表第一种:使用wm_concat() + distinct去重聚合第二种:使用listagg,

一文带你理解Python中import机制与importlib的妙用

《一文带你理解Python中import机制与importlib的妙用》在Python编程的世界里,import语句是开发者最常用的工具之一,它就像一把钥匙,打开了通往各种功能和库的大门,下面就跟随小... 目录一、python import机制概述1.1 import语句的基本用法1.2 模块缓存机制1.

深入理解C语言的void*

《深入理解C语言的void*》本文主要介绍了C语言的void*,包括它的任意性、编译器对void*的类型检查以及需要显式类型转换的规则,具有一定的参考价值,感兴趣的可以了解一下... 目录一、void* 的类型任意性二、编译器对 void* 的类型检查三、需要显式类型转换占用的字节四、总结一、void* 的

深入理解Redis大key的危害及解决方案

《深入理解Redis大key的危害及解决方案》本文主要介绍了深入理解Redis大key的危害及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、背景二、什么是大key三、大key评价标准四、大key 产生的原因与场景五、大key影响与危

MySQL中删除重复数据SQL的三种写法

《MySQL中删除重复数据SQL的三种写法》:本文主要介绍MySQL中删除重复数据SQL的三种写法,文中通过代码示例讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下... 目录方法一:使用 left join + 子查询删除重复数据(推荐)方法二:创建临时表(需分多步执行,逻辑清晰,但会

Redis事务与数据持久化方式

《Redis事务与数据持久化方式》该文档主要介绍了Redis事务和持久化机制,事务通过将多个命令打包执行,而持久化则通过快照(RDB)和追加式文件(AOF)两种方式将内存数据保存到磁盘,以防止数据丢失... 目录一、Redis 事务1.1 事务本质1.2 数据库事务与redis事务1.2.1 数据库事务1.

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

SpringBoot嵌套事务详解及失效解决方案

《SpringBoot嵌套事务详解及失效解决方案》在复杂的业务场景中,嵌套事务可以帮助我们更加精细地控制数据的一致性,然而,在SpringBoot中,如果嵌套事务的配置不当,可能会导致事务不生效的问题... 目录什么是嵌套事务?嵌套事务失效的原因核心问题:嵌套事务的解决方案方案一:将嵌套事务方法提取到独立类

Java中JSON字符串反序列化(动态泛型)

《Java中JSON字符串反序列化(动态泛型)》文章讨论了在定时任务中使用反射调用目标对象时处理动态参数的问题,通过将方法参数存储为JSON字符串并进行反序列化,可以实现动态调用,然而,这种方式容易导... 需求:定时任务扫描,反射调用目标对象,但是,方法的传参不是固定的。方案一:将方法参数存成jsON字

作业提交过程之HDFSMapReduce

作业提交全过程详解 (1)作业提交 第1步:Client调用job.waitForCompletion方法,向整个集群提交MapReduce作业。 第2步:Client向RM申请一个作业id。 第3步:RM给Client返回该job资源的提交路径和作业id。 第4步:Client提交jar包、切片信息和配置文件到指定的资源提交路径。 第5步:Client提交完资源后,向RM申请运行MrAp