#青训营 x 字节后端训练营# MVCC 读操作
1. 快照读(snapshot read)
> 读的是记录的可见版本, 不用加锁, select
2. 当前读(current read)
> 读取最新版本, insert / delete / update / select ... in share mode/for update
快照内容读取原则:
1. 版本未提交无法读取生成快照
2. 版本已提交,但是在快照创建后提交的,无法读取
3. 版本已提交,但是在快照创建前提交的,可以读取
4. 当前事务内自己的更新,可以读到
## 已提交读
每次执行语句的时候重新生成一次快照(read view), 每次select查询时
- 解决了脏读问题
每一次select 都会产生一次数据快照. prepare未commit的数据不会被快照读到
数据已经被事务正确commit提交过了
- 没有解决不可重复读
因为每一次slct都会重新产生一次数据快照,其它事务更新后而且已提交的数据,可以实时反馈到当前事务的select结果当中!
- 为什么无法解决”幻读“?
因为每一次selecti都会重新产生一次数据快照,其它事务增加了和当前事务查询条件相同的新的数据并且已成功commit提交,一致当前年斜以样的条件查询时,数据多了!
### 可重复读
同一个事务开始的时候生成一个当前事务全局性的快照(Read View), 第一次select查询时, 而且只产生一次(不是在事务开启的时候产生快照)
解决了"脏读"问题
为什么解决了"不可重复读问题"
为什么部分解决了"幻读"
虽然进行了快照读, 但自己更新的数据还是可以看到