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

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

对于不同的事务,采用不同的隔离级别分别有不同的现象。主要有下面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

相关文章

SpringKafka消息发布之KafkaTemplate与事务支持功能

《SpringKafka消息发布之KafkaTemplate与事务支持功能》通过本文介绍的基本用法、序列化选项、事务支持、错误处理和性能优化技术,开发者可以构建高效可靠的Kafka消息发布系统,事务支... 目录引言一、KafkaTemplate基础二、消息序列化三、事务支持机制四、错误处理与重试五、性能优

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3

Django序列化中SerializerMethodField的使用详解

《Django序列化中SerializerMethodField的使用详解》:本文主要介绍Django序列化中SerializerMethodField的使用,具有很好的参考价值,希望对大家有所帮... 目录SerializerMethodField的基本概念使用SerializerMethodField的

C++原地删除有序数组重复项的N种方法

《C++原地删除有序数组重复项的N种方法》给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度,不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(... 目录一、问题二、问题分析三、算法实现四、问题变体:最多保留两次五、分析和代码实现5.1、问题分析5.

Jackson库进行JSON 序列化时遇到了无限递归(Infinite Recursion)的问题及解决方案

《Jackson库进行JSON序列化时遇到了无限递归(InfiniteRecursion)的问题及解决方案》使用Jackson库进行JSON序列化时遇到了无限递归(InfiniteRecursi... 目录解决方案‌1. 使用 @jsonIgnore 忽略一个方向的引用2. 使用 @JsonManagedR

Seata之分布式事务问题及解决方案

《Seata之分布式事务问题及解决方案》:本文主要介绍Seata之分布式事务问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Seata–分布式事务解决方案简介同类产品对比环境搭建1.微服务2.SQL3.seata-server4.微服务配置事务模式1

Git如何修改已提交人的用户名和邮箱

《Git如何修改已提交人的用户名和邮箱》文章介绍了如何修改Git已提交人的用户名和邮箱,包括注意事项和具体步骤,确保操作正确无误... 目录git修改已提交人的用户名和邮箱前言第一步第二步总结git修改已提交人的用户名和邮箱前言需注意以下两点内容:需要在顶层目录下(php就是 .git 文件夹所在的目

javaScript在表单提交时获取表单数据的示例代码

《javaScript在表单提交时获取表单数据的示例代码》本文介绍了五种在JavaScript中获取表单数据的方法:使用FormData对象、手动提取表单数据、使用querySelector获取单个字... 方法 1:使用 FormData 对象FormData 是一个方便的内置对象,用于获取表单中的键值

Redis 多规则限流和防重复提交方案实现小结

《Redis多规则限流和防重复提交方案实现小结》本文主要介绍了Redis多规则限流和防重复提交方案实现小结,包括使用String结构和Zset结构来记录用户IP的访问次数,具有一定的参考价值,感兴趣... 目录一:使用 String 结构记录固定时间段内某用户 IP 访问某接口的次数二:使用 Zset 进行

Spring Boot 整合 ShedLock 处理定时任务重复执行的问题小结

《SpringBoot整合ShedLock处理定时任务重复执行的问题小结》ShedLock是解决分布式系统中定时任务重复执行问题的Java库,通过在数据库中加锁,确保只有一个节点在指定时间执行... 目录前言什么是 ShedLock?ShedLock 的工作原理:定时任务重复执行China编程的问题使用 Shed