其他分享
首页 > 其他分享> > 三张图片告诉你:啥是脏读、不可重复读、幻读

三张图片告诉你:啥是脏读、不可重复读、幻读

作者:互联网

文章目录


前言


一、数据库事务的ACID是什么?

提到数据库事务,我们都知道有的四大特性 ACID,那么都分别是什么意思呢?

二、脏读、不可重复读、幻读的问题

SQL标准定义了4类隔离级别:

这四种隔离级别的效率依次递减,读未提交效率最高,串行化效率最低。
同样伴随着效率的问题,效率越高,问题越多。

隔离级别脏读不可重复读幻读
READ UNCOMMITTED (读未提交)有可能有可能有可能
READ COMMITTED (不可重复读、读已提交)不可能有可能有可能
REPEATABLE READ (可重复度)不可能不可能有可能
SERIALIZABLE (串行化)不可能不可能不可能

1.脏读

一个事务中查询出来的数据,有可能是其他事务还未提交的数据。
也就是我在开启一个事务后,select出来的数据,有可能不是数据库最终的数据。

在这里插入图片描述

2.不可重复读

在同一个事务中,同一条SQL语句,在不同时刻,查询出来的内容不一致。
这种现象就叫 不可重复读。

在这里插入图片描述

3.幻读

很多人分不清楚幻读和不可重复读。
幻读指的是,在同一事务下,某一次的 select 操作得到的结果所表征的数据状态无法支撑后续的业务操作。更为具体一些:select 某记录是否存在,不存在,准备插入此记录,但执行 insert 时发现此记录已存在,无法插入,此时就发生了幻读。

不可重复读指的是:同一个SQL执行多次查询,得到的结果不一致。

幻读: 根据同一个条件,查询出来的结果 和 按照相同条件进行update或者insert操作时候出现逻辑不一致的情况。
举个例子:
在同一个事务中,先根据 条件 age = 20 可以查询出2条数据,然后我再根据 age=20 进行update,结果更新了 3条数据,与预期结果不一致。 这种现象就叫做幻读,好像之前读取的数据是假的。
再举一个插入的例子:
在同一个事务中,id是主键。根据id=100查询不到数据,然后我进行insert语句,插入一条id=100的数据,结果插入失败,提示id=100的记录已存在。这也出现了insert与select预期不一致,好像之前select查询的数据有错误,这种现象也叫做幻读。
在这里插入图片描述

三、MVCC机制

提到MySQL的事务隔离机制,很多人都会提到一个词,就是MVCC机制。
MVCC (Multiversion Concurrency Control),翻译为:多版本并发控制技术。
Mysql就是通过这种机制解决的可重复读的问题。

MVCC机制解决了,MySQL实现可重复度的情况下,还提高了并发的性能。如果没有MVCC机制,要实现可重复读可能就得通过加锁的方式,那么如果对整张表进行加锁,对数据的并发就会有很大的影响,如果每次都对行加锁呢,也同样会在性能上有影响。
为了解决这些问题,才有出现了MVCC机制。
MVCC是指的一种机制,各家的数据库厂商都有自己的实现,并非是一种标准,Oracle,PostgreSQL等其他数据库系统也都实现了MVCC,但是各自的实现机制并不相同。

MVCC是行级锁的一个变种,但是它在很多情况下避免了加锁操作,因此开销更低。大多数的MVCC都实现了非阻塞的读操作,写操作也只锁定必要的行。

下一篇文章,我们解密MySQL的MVCC机制原理。

标签:事务,隔离,幻读,数据库,重复,脏读,MVCC,三张
来源: https://blog.csdn.net/liujianyangbj/article/details/117962129