传统事务-MVCC详解
MVCC
当前读
读取的是记录的最新版本,读取时还要保证并发事务不能修改当前记录,会对读取的记录进行加锁,比如:select.. lock in share mode(共享锁)、select .. for update、update、delete、insert(排他锁)都是一种当前读。
在RR隔离级别下,是看不到其他事务已经提交的数据

使用当前读就可以读取到已提交的数据

快照读
简单的select(不加锁)就是快照读,快照读读取的是记录数据的可见版本,有的是历史数据,不加锁是非阻塞读。
不同隔离级别下快照读不同:
RC:每一个select,都会产生一次快照读。因此会出现不可重复读
RR:开启事务后的第一个select语句才会产生一个快照读,之后的每次读取都是读取的这个快照,因此它可以解决不可重复读的问题
Serializable:快照读会变更为当前读
MVCC介绍
全称Multi-Version Concurency Control,多版本并发控制。指维护一个数据的多版本,快照读为MSQL实现MVCC提供了一个非阻塞读功能,使读写操作没有冲突。MVCC的具体实现,还依赖于数据库记录中的三个隐式字段、undo log日志、readView。
隐藏字段

每张表都会有三个隐藏字段,mysql8.0以后提供了ibd2sdi工具可以解析查看ibd文件,可以看到三个隐藏字段



undo log 版本链
当执行insert时,产生的undo log日志,只在回滚时需要,事务提交后就没用了,可立即删除
update和delete,产生的undo log日志,在回滚时和快照读的时候都需要,不会立即删除
undo log版本链:不同事务或相同事务对同一条记录进行修改会导致该记录的undo og生成一条版本记录链表,链表的头部是最新的旧纪录,链表的尾部是最早的旧纪录。

readView(读视图)
readView(读视图)是快照读SQL执行时MVCC提取数据的依据,记录并维护系统当前活跃的事务(未提交的)id。readView中包含四个核心字段


生成快照读的时候就会生成readview
热门帖子
- 12025-12-01浏览数:182759
- 22023-05-09浏览数:25052
- 42023-09-25浏览数:18521
- 52020-05-11浏览数:17526