一文搞懂MySQL中的四大隔离级别

本文详细介绍了InnoDB引擎中事务的作用,以及四种隔离级别(读未提交、读已提交、可重复读和序列化)的特点。重点对比了不可重复读和幻读的区别,并通过实例阐述了各自在实际操作中的表现。理解这些隔离级别有助于确保数据库数据的一致性和安全性。

事务和隔离级别的联系

为了保证数据的安全性,InnoDB引擎推出了事务的概念
事务的提出和实现大大提高了MySQL的数据安区
而事务中最重要的莫非于事务的四大隔离级别

重要

不可重复读和幻读的区别?

不可重复读和幻读描述的侧重点是不同的,不可重复读描述的是修改操作,比如t1时间读取了-行数据,t2时间的时候读
取到了这个数据,内容已经发生改变了,这个就叫做不可重复读;而幻读描述的是幻象行的问题,它是指,, 在t1时间使用-一个
sq|得到了n条数据,而在t2时间使用相同的sq|却得到了n+1数据,那么多出来的这一条数据就叫做幻象行,而这个操作就
叫做幻读。也就是说不可重复读描述的侧重点是修改操作,而幻读描述的侧重点是添加(或删除)操作。

下面我们介绍一下事务四种隔离级别

MySQL 的隔离级别有 4 种:

  1. 读未提交(read uncommitted):有脏读、不可重复读、幻读问题。
    下图为脏读的演示
    这种隔离级别容易读到脏数据,所以很危险
    通俗的讲是
    读未提交,也叫未提交读,该隔离级别的事务可以看到其他事务中未提交的数据。该隔离级别因为可以读取到其他事务中未提交的数据,⽽未提交的数据可能会发⽣回滚,因此我们把该级别读取到的数据称之为脏数据,把这个问题称之为脏读。

在这里插入图片描述

2. READ COMMITTED:读已提交

也叫提交读
可以解决脏读问题,但是存在不可重复读的问题
不可重复度:使用相同的sql语句,执行了两次,但是得到了不同的结果,这个就叫不可重复读。
不可重复度演示
不可重复读:在⼀个事务中,两次查询同⼀条数据得到了不同的结果就是不可重复读。在⼀个事务两次查询中间,另⼀个事务把这条数据修改了。
在这里插入图片描述

3. 可重复读(repeatable read)

他是MySQL中的默认隔离级别
可以解决不可重复读的问题,但是存在幻读问题
幻读:当同⼀查询在不同时间产⽣不同的结果,就是事务中的幻读问题。例如,⼀个 SELECT 被执⾏了两次,但是第⼆次返回了第⼀次没有返回的⼀⾏,那么这⼀⾏就是⼀个“幻像”⾏。
在这里插入图片描述

4. SERIALIZABLE:序列化

是事务的最⾼隔离级别,它会强制事务排序,使之不会发⽣冲突,从⽽解决
了脏读、不可重复读和幻读问题,但因为执⾏效率低,所以真正使⽤的场景并不多。

四种隔离级别问题对比

在这里插入图片描述

概念放在最后

  1. READ UNCOMMITTED:读未提交,也叫未提交读,该隔离级别的事务可以看到其他事务中未提交
    的数据。该隔离级别因为可以读取到其他事务中未提交的数据,⽽未提交的数据可能会发⽣回滚,
    因此我们把该级别读取到的数据称之为脏数据,把这个问题称之为脏读。
  2. READ COMMITTED:读已提交,也叫提交读,该隔离级别的事务能读取到已经提交事务的数据,
    因此它不会有脏读问题。但由于在事务的执⾏中可以读取到其他事务提交的结果,所以在不同时间
    的相同 SQL 查询中,可能会得到不同的结果,这种现象叫做不可重复读。
  3. REPEATABLE READ:可重复读,是 MySQL 的默认事务隔离级别,它能确保同⼀事务多次查询的
    结果⼀致。但也会有新的问题,⽐如此级别的事务正在执⾏时,另⼀个事务成功的插⼊了某条数
    据,但因为它每次查询的结果都是⼀样的,所以会导致查询不到这条数据,⾃⼰重复插⼊时⼜失败
    (因为唯⼀约束的原因)。明明在事务中查询不到这条信息,但⾃⼰就是插⼊不进去,这就叫幻读
    (Phantom Read)。
  4. SERIALIZABLE:序列化,事务最⾼隔离级别,它会强制事务排序,使之不会发⽣冲突,从⽽解决
    了脏读、不可重复读和幻读问题,但因为执⾏效率低,所以真正使⽤的场景并不多。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值