【MySQL 原理】03 事务的隔离级别

一、事务

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

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

-w440

二、ACID

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

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

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

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

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

三、隔离级别

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

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

3.1 脏读(Read Uncommitted)

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

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

举例:

操作顺序 事务A 事务B
1 Begin
2 Begin
3 select balance from account where id=1;(结果为1)
4 update account set balance=2 where id=1;
5 select balance from account where id=1;(结果为2)

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

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

-w385

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

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

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

举例:

操作顺序 事务A 事务B
1 Begin
2 Begin
3 select balance from account where id=1;(结果为1)
4 update account set balance=2 where id=1;
5 select balance from account where id=1;(结果为1)
6 commit
7 select balance from account where id=1;(结果为2)

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

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

-w176

3.3 幻读

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

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

举例:

操作顺序 事务A 事务B
1 Begin
2 Begin
3 select * from example where id=10;(结果为空)
4 insert into example value(10);
5 commit
6 select balance from account where id=10;(结果为空)
7 update example set name=’test’ where id=10 (更新成功)
8 select * from example where id=10;(有10这个记录)

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

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

未完待续…

本文标题:【MySQL 原理】03 事务的隔离级别

文章作者:Craze lee

发布时间:2019年05月14日 - 10:05

最后更新:2019年07月03日 - 02:07

原始链接:http://craze-lee.github.io/2019/05/14/MySQL/事务的隔离级别/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

您的支持将鼓励我继续创作!