33

面试官:什么是脏读、幻读?

 4 years ago
source link: https://www.tuicool.com/articles/NrQ7ZfA
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

一、事务

事务是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。--摘自百科

在MySQL里,事务是在引擎层面实现,比如MyIsam不支持,InnoDB支持

二、ACID

提到事务,肯定会想到 ACID 是吧,自行感受一下概念,然后我们来讲讲隔离性的问题。

  • 原子性( Atomicity ):事务的所有操作要么全部成功,要么全部回滚。

  • 一致性( Consistency ):总是从一个一致性的状态转换到另一个一致性的状态。

  • 隔离性( Isolation ):多个事务并发执行时,一个事务的执行不应影响其他事务的执行

  • 持久性( Durability ):已被提交的事务对数据库的修改应该永久保存在数据库中。

三、隔离级别

脏读   幻读   不可重复读 ,做了多年的 CRUDer,对这几个词真是不陌生,要不是出去面试,也真不会去了解。希望大家看完之后,面试的时候,不要慌,跟他刚。

实际上,这些场景都是出现在多个事务同时执行时的场景。

3.1 脏读(Read Uncommitted)

通俗的讲,一个事务在处理过程中读取了另外一个事务未提交的数据。

你都还没提交,我就读到了你刚操作的数据,万一你回滚了怎么办,你说这脏不脏。

举例:

YBBZFji.jpg!web

假设打赏的逻辑是:① 我的账户+1元;② 你的账户-1元。

当你执行到第一个步骤,我去查询我的账户已经是2元了,很开心!!!宣布请大家去撸串!!!但是最后扣款的时候发现你余额不足了,回滚了,我的1元没了,就很难受!!

RVBF3mu.jpg!web

3.2 不可重复读(Non-repeatable Read)

通俗的讲,一个事务范围内,多次查询某个数据,却得到不同的结果。

与脏读的区别:脏读是读到未提交的数据,而不可重复读读到的却是已经提交的数据,但实际上是违反了事务的一致性原则。

举例:

BvEJ3mb.jpg!web

假设我查了下账户余额,看到你们给小编打赏了1块钱,很开心!!!宣布请大家去撸串!!!在付款之前,钱被另外一个人取走,又查询到没钱了,被留下来洗碗了!!!

因为我查询完后,这条数据没锁住,又被别的事务更新了,导致当前事务每次都是读到最新的数据。

FFzuQz2.jpg!web

3.3 幻读

在Repeatable Read隔离级别下,一个事务可能会遇到幻读(Phantom Read)的问题。

事务A读取与搜索条件相匹配的若干行。事务B以插入或删除行等方式来修改事务A的结果集,然后再提交。

举例:

vyEzIr6.jpg!web

看到了吗,在一个事务A中,第一次查询某条记录,是没有的,但是,当试图更新这条不存在的记录时,竟然能成功,并且,再次读取同一条记录,它就神奇地出现了。

实际上,在InnoDB引擎中,对于索引的扫描,不仅锁住扫描到的索引,而且还锁住这些索引覆盖的范围(gap),因此这个范围是内插入数据是不允许的。

未完待续…

RBJvqae.jpg!web


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK