MVCC 隔离级别 视图

2020-09-14  本文已影响0人  云中人山

MVCC

Mysql/Oracle等数据库 均实现了MVCC(多版本并发控制),但各自的实现机制不尽相同。

Mysql的事务性存储引擎才可以实现MVCC,可以认为MVCC是行级锁的一个变种,但是它在很多情况下避免了加锁操作。

MVCC的实现,是通过保存数据在某个时间点的快照来实现的

InnoDB的MVCC,是通过在每行记录后面保存两个隐藏的列来实现的。一个保存了行的创建时间,一个保存了行的过期时间

“快照”在MVCC中作用(此小节来自极客时间付费课程 欢迎购买对应课程)

在可重复读隔离级别下,事务在启动的时候就“拍了个快照”。注意,这个快照是基于整库的

InnoDB 里面每个事务有一个唯一的事务 ID,叫作 transaction id。它是在事务开始的时候向 InnoDB 的事务系统申请的,是按申请顺序严格递增的。而每行数据也都是有多个版本的。每次事务更新数据的时候,都会生成一个新的数据版本,并且把 transaction id 赋值给这个数据版本的事务 ID,记为 row trx_id。

同时,旧的数据版本要保留,并且在新的数据版本中,能够有信息可以直接拿到它。也就是说,数据表中的一行记录,其实可能有多个版本 (row),每个版本有自己的 row trx_id。

img

视图

在 MySQL 里,有两个“视图”的概念:

这里视图,即是上文所说的快照


隔离级别

ACID(Atomicity、Consistency、Isolation、Durability,即原子性、一致性、隔离性、持久性),今天我们就来说说其中 I,也就是“隔离性”

当数据库上有多个事务同时执行的时候,就可能出现脏读(dirty read)、不可重复读(non-repeatable read)、幻读(phantom read)的问题,为了解决这些问题,就有了“隔离级别”的概念。

在谈隔离级别之前,你首先要知道,你隔离得越严实,效率就会越低。因此很多时候,我们都要在二者之间寻找一个平衡点。SQL 标准的事务隔离级别包括:读未提交(read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(serializable )。下面我逐一为你解释:

数据库里面会创建一个视图,访问的时候以视图的逻辑结果为准。


事务的视图规则

对于一个事务来说,除了自己的更新总是能看到以外,其余的遵守以下规则

另外:


上一篇下一篇

猜你喜欢

热点阅读