可以再加上写的过程,tidb 这个读和写,还有mvcc 是如何实现在,还是有点复杂呢,

tidb 中的SQL继续讨论:

【 TiDB 使用环境】生产环境 /测试/ Poc
【 TiDB 版本】
【复现路径】做过哪些操作出现的问题
【遇到的问题:问题现象及影响】
【资源配置】进入到 TiDB Dashboard -集群信息 (Cluster Info) -主机(Hosts) 截图此页面
【附件:截图/日志/监控】

可以参考下官方课程

https://learn.pingcap.cn/learner/player/120012;id=120012;classroomId=9;rcoId=630198;courseDetailId=120005;learnerAttemptId=1735959455964

https://docs.pingcap.com/zh/tidb/stable/tikv-in-memory-engine#tikv-mvcc-内存引擎

TiKV MVCC 内存引擎

DML的读写实现


读写你看上面的图,mvcc 我补充下,比如现在有一行数据,要修改它,但我希望在我修改它的同时,别人仍然可以读到它的原值,我会先复制一个副本,在副本中修改它,
修改完后提交后,我修改的版本的时间戳比它原版本 的时间戳要新,别人下次再读,就会读到我(读最新的值 ),这是不是就可以有多个版本了,这就是MVCC的大致原理,
tikv 在修改数据时,其实都是写新值,历史版本数据本来就存在,所以tikv要实现MVCC还挺容易,关健看如何读取老版本数据

是的。关键就是时间戳,不同的时间戳请求到的数据是不同的。

1 个赞

用董飞老师的图


事务1 两个修改1,2都提交了 可以读到
事务2 两个修改1,4没提交 读不到
这时候
如果读第一行 ,先去write里查找发现1-110是最新的根据1-110去default里去找1-100读取数据
如果写修改一行,先去write里查找发现1-110是最新的,再去Lock查看有一个锁115,这时写呗阻塞
如果写修改二行,先去write里查找发现2-110是最新的,再去Lock查看没有Lock,然后根据2-110去default里去找2-100读取数据加载到内存

总结:MVCC机制写不阻塞读,只阻塞写操作