前言
本博客主要是对《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)
如果一个事务修改了另一个未提交事务修改过的数据,就意味着发生了脏写现象。
示意图如下:
如上图,Session A
和Session B
各开启了一个事务,Session B
中的事务先将number
列为1
的记录的name
列更新为'关羽'
,然后Session A
中的事务接着又把这条number
列为1
的记录的name
列更新为张飞
。如果之后Session B
中的事务进行了回滚,那么Session A
中的更新也将不复存在,这种现象就称之为脏写
。这时Session A
中的事务就很懵逼,我明明把数据更新了,最后也提交事务了,怎么到最后说自己啥也没干呢?
脏读(Dirty Read)
如果一个事务读到了另一个未提交事务修改过的数据,就意味着发生了脏读现象。
示意图如下: