事务隔离级别和MVCC

本文详细介绍了MySQL中的事务隔离级别,包括脏写、脏读、不可重复读和幻读的概念,并探讨了MVCC(多版本并发控制)的工作原理,如版本链、ReadView以及如何判断记录的可见性。此外,还讨论了读已提交与可重复读的区别,以及MVCC在二级索引中的应用和purge操作的作用。
摘要由CSDN通过智能技术生成

前言

本博客主要是对《MySQL是怎样运行的》一书的内容进行整理

MVCC本身与undo log强相关,在正式介绍之前需要对undo log和redo log的概念进行汇总:

InnoDB事务日志(redo log 和 undo log)详解

概括而言,redo log本身为对执行指令的记录,包含了生成undo log的内容

同时redo log需要持久化,undo log并不需要

第21章 事务隔离级别和MVCC

我们希望让不同的事务“隔离”地执行,互不干涉。这也就是事务的隔离性。

串行执行过于严格,会严重降低系统吞吐量和资源利用率,增加事务的等待时间,因此需要采用其他机制来保证并发执行的事务的执行结果与串行执行的结果一样

两个并发的事务在执行过程中访问相同数据的情况有四种:读——读,读——写,写——读,——写——写。只有在至少一个事务对数据进行写操作时,才可能带来一致性问题。

这一致性通常通过加锁来搞定,不过即使是可串行化执行,性能上也会有一定的损失。因此我们可以选择牺牲一部分隔离性来换取性能上的提升。

事务并发执行时遇到的一致性问题

脏写(Dirty Write)

如果一个事务修改了另一个未提交事务修改过的数据,就意味着发生了脏写现象。

示意图如下:

image_1d8nigfq618jd1cc56231rt0uq19.png-78.2kB

如上图,Session ASession B各开启了一个事务,Session B中的事务先将number列为1的记录的name列更新为'关羽',然后Session A中的事务接着又把这条number列为1的记录的name列更新为张飞。如果之后Session B中的事务进行了回滚,那么Session A中的更新也将不复存在,这种现象就称之为脏写。这时Session A中的事务就很懵逼,我明明把数据更新了,最后也提交事务了,怎么到最后说自己啥也没干呢?

脏读(Dirty Read)

如果一个事务读到了另一个未提交事务修改过的数据,就意味着发生了脏读现象。

示意图如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值