本文主要是介绍看完这篇文章,让你彻底理解事务隔离级别(读未提交、读已提交、可重复读、序列化),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
对于不同的事务,采用不同的隔离级别分别有不同的现象。主要有下面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到了吗?用相同方法去尝试模拟幻读吧
序列化就不做过多演示了。序列化可以解决幻读。但是这个隔离级别性能消耗太大。基本不用
这篇关于看完这篇文章,让你彻底理解事务隔离级别(读未提交、读已提交、可重复读、序列化)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!