简介:MySQL的四种事务隔离级别
MySQL数据库的四种事务的隔离级别分别是什么,有什么作用?大家还记得吗?
我今天在网上刷题,突然刷到这类题目,但是我居然答错了,好尴尬呀😂。不废话,直接上主题吧!
什么是事务隔离级别
数据库事务隔离级别主要作用是实现事务工作期间,数据库操作读的隔离特性,所谓读的操作就是将数据页可以调取到内存;然后可以读取数据页中相应数据行的能力,并且不同事务之间的数据页读操作相互隔离;
可以简单理解为:一个事务在对数据页中数据行做更新操作时,在没有更新提交前,另一个事务此时是不能读取数据页中数据行内容的;
对于数据库存储事务隔离级别包括4种,可以通过操作命令查看获取当前使用的隔离级别:
select @@transaction_isolation;
关键字解读
脏读:脏读主要表示在一个事务窗口中,没有数据修改提交操作前,另一个事务就可以看到内存中数据页的修改;简单理解:在一个事务窗口中,可以读取到别人没有提交的数据信息;
幻读:指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,比如这种修改涉及到表中的“全部数据行”。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入“一行新数据”。那么,以后就会发生操作第一个事务的用户发现表中还存在没有修改的数据行,就好象发生了幻觉一样.一般解决幻读的方法是增加范围锁RangeS,锁定检索范围为只读,这样就避免了幻读
MySQL支持的四种事务隔离级别及其作用:
1、读未提交(Read Uncommitted)
该隔离级别允许事务读取其他事务未提交的数据,隔离性差,可能会导致脏读,不可重复读和幻读问题
2、读提交(Read Committed)
该隔离级别保证事务读取的数据都是已提交的,避免了脏读问题,隔离性一般,但仍然有可能出现不可重复读和幻读问题
3、可重复读(Repeatable Read)
MySQL默认的事务隔离级别,该隔离级别在读提交的基础上,进一步限制了并发事务对数据的修改,确保了事务读取的数据在整个事务期间不变,但仍然存在幻读问题
4、串行化(Serializable)
有些人对该隔离级别称为序列化。该隔离级别是最高的隔离级别,它确保了事务的串行执行,避免了脏读、不可重复读和幻读的问题,但也会降低系统的并发度。
实验一下
现在我们已经了解了MySQL的四种隔离级别,下面我们通过SQL看看这四种隔离级别都有什么样的表现吧!
由于命令行下会自动提交,我们需要临时关闭MySQL的自动提交功能
# 临时关闭自动提交功能:
set autocommit=0;
set global autocommit=0;
#查看是否关闭自动提交功能
select @@autocommit;
select @@global.autocommit;
1、读未提交(Read Uncommitted)
我们将MySQL事务隔离级别设置成:READ-UNCOMMITTED
#查看事务隔离级别
select @@transaction_isolation;
select @@global.transaction_isolation;
#如果不是READ-UNCOMMITTED,则设置事务隔离级别
set transaction_isolation='READ-UNCOMMITTED';
set global transaction_isolation='READ-UNCOMMITTED';
注意:隔离级别的参数设置,分当前session和全局配置,实验时最好都设置成一样
接下来我们就通过一个窗口设置事务并修改数据,另一个窗口读取数据,看看是否能读取到事务修改未提交的数据
2、读提交(Read Committed)
和上面一样,第一步设置事务隔离级别为:READ-COMMITTED
#设置事务隔离级别
set transaction_isolation='READ-COMMITTED';
set global transaction_isolation='READ-COMMITTED';
验证方式和上面一样,通过两个窗口执行SQL
3、可重复读(Repeatable Read)
和上面一样,第一步设置事务隔离级别为:REPEATABLE-READ
set transaction_isolation='REPEATABLE-READ';
set global transaction_isolation='REPEATABLE-READ';
注意由于上面已经设置了其他隔离级别,如果又在当前窗口设置其他隔离级别可能会导致无效,我们可以重启MySQL,再设置隔离级别
接下来我们就通过一个窗口设置事务并修改数据,另一个窗口读取数据,看看是否能读取到事务修改未提交的数据
4、串行化(Serializable)
和上面一样,第一步设置事务隔离级别为:SERIALIZABLE
set transaction_isolation = 'SERIALIZABLE';
set global transaction_isolation = 'SERIALIZABLE';
执行结果和上面的【可重复读】一样,无法读取事务中的数据。
有遗漏或者不对的可以在我的公众号留言哦