一、读未提交(READ-UNCOMMITTED)
当事务隔离级别设置为READ-UNCOMMITTED(读未提交)时,在这种状态下,一个会话更新的数据会被其他的会话马上看到,即使该更新的数据尚未被事务所提交(commit)。
打开两个会话,分别设置它们的隔离级别。
会话一:
由图可见,会话一的session隔离级别被设置为READ-UNCOMMITTED(读未提交)。
会话二:
由图可见,会话二的session隔离级别被设置为REPEATABLE-READ(可重复读)。
我们将在表classes(存储引擎为InnoDB)下做测试,首先先来看下classes都已有哪些数据:
由图可见classes里面现在有3条数据。
在会话一中新增一条新数据但不提交:
如图所示,在会话一中新增数据“Middle four”,虽未提交,但在会话一中马上就能查看到。
那在会话二中是否能看到?
由图可见,会话二无法看到在会话一中未提交的数据。为什么会出现这种情况?因为会话二中的session隔离级别为REPEATABLE-READ,无法脏读,即无法查看到未提交数据。那是否更改为READ-UNCOMMITTED就可以查看得到呢?
如图所示,当session隔离级别更改为READ-UNCOMMITTED时,会话二中即马上能看到会话一中未提交的数据。
如果此时会话一中执行回滚(rollback),那么会话一和会话二都会马上看到class_num=’10004’的数据已不存在。
会话一:
会话二:
结论:当一个会话的(session)事务隔离级别被设置为READ-UNCOMMITTED时,那么它将可以马上看到其他会话更新的未提交数据,也既会出现脏读。
二、读已提交(READ-COMMITTED)
当事务隔离级别设置为READ-COMMITTED(读已提交)时,在这种状态下,一个会话更新的数据不会被其他的会话马上看到,除非该更新的数据已被事务所提交(commit)。
将会话一和会话二的session隔离级别都设置为READ-COMMITTED:
会话一:
会话二:
然后在会话一开启一个新事务,并插入一条新数据,但先不要提交,如图:
由图可知,此时会话一可以查到该未提交的数据,和前面session设置为READ-UNCOMMITTED一样,那是不是说明会话一出现了脏读?
看看会话二是否也可以查看得到:
由图可知,会话二无法读取到会话一中未提交的数据。那这就说明会话一中出现的情况(能读取自己未提交的数据)并不是脏读,因为会话二和会话一的隔离级别都是READ-COMMITTED,如果会话一出现了脏读,那么会话二也会出现。
那这是什么情况?本人认为这是因为它们是在同一个事务里,所以前面的操作对后面的操作是可见的,也即是后面的操作认为前面的操作已完成,所以它可以获取前面更新的数据。
此时会话一提交事务,会话二马上可以看到提交的事务:
总结:当一个会话的(session)事务隔离级别被设置为READ-COMMITTED时,那么它只可以看到其他会话已经提交的数据。
三、可重复读(REPEATABLE-READ)
当事务隔离级别设置为REPEATABLE-READ(可重复读)时,在这种状态下,同一个事务中的多次查询结果都是一致的(既不会出现不可重复读的现象),即使在此期间其他会话更新了数据,这些数据对其也是不可见的。
将会话一和会话二的session隔离级别都设置为REPEATABLE-READ:
会话一:
会话二:
此时在会话一中开启事务,并查看现有数据,先不做commit:
现在一共有5条数据。此时,我们通过会话二插入一条新数据:
然后再回到会话一,重新查看数据:
由图可见,会话二更新的数据对其不可见。
会话一提交事务后再查看数据:
此时会话二添加的数据已可查看。
由此可见,当事务的隔离级别被设置为REPEATABLE-READ后,同一个事务中的select语句查出的结果都是一致的,其他事务在此期间提交的数据将对其不可见。
四、串行化(Serializable)
当事务隔离级别设置为SERIALIZABLE(串行读)时,在这种状态下,一个会话事务中的select操作将会阻塞其他事务的写(add、update和delete)操作,但不会阻塞读。
将会话一和会话二的(session)事务隔离级别都设置为SERIALIZABLE:
会话一:
会话二:
在会话一开启新事务,然后select下数据,但先不做commit操作:
此时在会话二中插入一条新数据,发现无法插入,插入操作一直被阻塞:
但select操作未被阻塞:
在会话一中执行commit操作,然后重新开启一个事务,并插入一条新数据,但先不提交:
此时在会话二中针对会话一新添的数据的任何写操作都会被阻塞:
但其他数据的读写操作不会被阻塞:
由此可以得出结论,当(session)事务的隔离级别被设置为SERIALIZABLE时,一个会话中的select操作会阻塞其他会话中的写操作,但不会阻塞select操作,而且一个会话中的写操作,会阻塞其他会话对同一条数据进行写操作。
相关推荐
MySQL事务隔离级别是数据库管理系统中一个非常重要的概念,它关系到数据的一致性和并发性能。在MySQL中,事务被用于确保数据库操作的原子性、一致性、隔离性和持久性(ACID特性)。事务隔离级别主要涉及四个方面:读...
Mysql的四种隔离级别 Mysql的四种隔离级别 Mysql的四种隔离级别
MySQL 支持四种事务隔离级别:READ UNCOMMITTED(读未提交)、READ COMMITTED(读已提交)、REPEATABLE READ(可重复读)和 SERIALIZABLE(串行化)。每种隔离级别对应不同程度的事务并发问题的防范,其中,MySQL ...
MySQL数据库管理系统提供了四种事务隔离级别来处理事务并发中可能遇到的问题。事务并发问题通常包括脏读、不可重复读和幻读。 一、事务的基本要素(ACID) 事务具有四个基本要素,即原子性(Atomicity)、一致性...
查询:默认事务隔离级别 mysql> select @@tx_isolation;当前会话的默认事务隔离级别 mysql> select @@session.tx_isolation;当前会话的默认事务隔离级别 mysql> select @@global.tx_isolation;全局的事务隔离级别
事务隔离级别 课程目标 了解 —— 事务隔离级别的概念; 理解 —— 事务隔离的四种级别; 掌握 —— 事务隔离级别的设置; 事务隔离级别 事务隔离:每一个事务都有一个所谓的隔离级,它定义了用户彼此之间隔离和交互...
深入理解Mysql事务隔离级别与锁机制 Mysql事务隔离级别与锁机制是数据库系统中非常重要的概念,它们都是为了解决多事务并发问题而设计的。下面我们将深入讲解这些机制,让大家彻底理解数据库内部的执行原理。 事务...
MySQL数据库在处理并发事务时,采用了多种机制来确保数据的一致性和隔离性,其中关键的概念包括隔离级别、锁以及多版本并发控制(MVCC)。理解这些机制有助于优化数据库性能和解决并发冲突。 首先,隔离级别是...
来自一线大厂的MySQL lock 隔离级别的相关介绍,很赞,强烈推荐
MySQL的可重复读(RR)隔离级别是一种重要的事务隔离级别,旨在避免不可重复读和幻读问题,保证事务在并发环境下的一致性。ReadView(读视图)机制是实现这一隔离级别核心手段之一。本文将详细解析MySQL RR隔离级别...
本文将详细介绍MySQL的隔离级别,如何配置它们,以及不同隔离级别对数据库性能和并发能力的影响。 选择合适的隔离级别对于确保数据库的并发性能和数据一致性至关重要。通过理解不同隔离级别的特点和影响,数据库管理...
MySQL数据库的事务隔离级别是数据库管理系统中用于控制事务处理中并发操作的重要机制。在多用户同时访问数据库的情况下,事务隔离级别能够确保数据的一致性和完整性,避免并发操作带来的各种问题,如脏读、不可重复...
MySQL数据库在处理并发事务时,隔离级别和锁机制起着至关重要的作用,它们确保了数据的一致性和安全性。本文将详细探讨这两个概念及其在生产环境中的应用。 首先,`autocommit` 参数决定了MySQL是否会自动提交事务...
MySQL中的事务隔离级别是数据库管理系统确保事务之间相互独立的重要机制,它主要针对并发操作时可能出现的问题,如脏读、不可重复读和幻读等。在MySQL的InnoDB存储引擎中,有四种不同的事务隔离级别: 1. **读未...
MySQL 数据库中的事务隔离级别是确保数据库在高并发环境下数据一致性的重要机制。SQL 标准定义了四个隔离级别,它们分别是 Read Uncommitted、Read Committed、Repeatable Read 和 Serializable,每种级别都针对不同...
mysql 8.0.22 下载安装配置方法,供大家参考,具体内容如下 ... ... 您可能感兴趣的文章:mysql多版本并发控制MVCC的实现关于Mysql隔离级别、锁与MVCC介绍SpringBoot中通过实现WebMvcConfigurer参数
MySQL数据库隔离级别
Mysql事务隔离级别.docx