MySQL的MVCC

发布时间:2024年01月20日

MVCC(多版本并发控制)multiversion concurrency control

读读并发:可以并发

读写并发(innoDB):MVCC机制解决?

写写:互斥

快照读:不加锁的简单select属于快照读,即不加锁的非阻塞读

快照读的基础是undolog版本链

聚簇索引中的隐藏列

trx_id:事务对数据改动时,事务将id赋值给trx_id

roll_pointer:旧值指针,roll_pointer生成undolog链

ReadView:快照读,它会告诉我们应该看到的快照

由四个部分组成:

1.creator_trx_id: 创建ReadView的事务的id

2.m_ids:活跃事务(在执行未提交)的id

3.min_trx_id: m_ids中的最小值(用于比较)

4.max_trx_id: 生成ReadView时,innoDB将要分配的下一个事务id

事务A(id:100)插入数据18;之后事务B(id:200)和C(id:300)并发执行,此时

creator_trx_id: 200

m_ids: 200 300

min_trx_id:200

max_trx_id:301

事务B(id:200)第一次查询时,会将隐藏字段trx_id(已提交事务A 的id)和min_trx_id进行比较,trx_id(100) 小于min_trx_id(200),则B可以查询到A的数据18;

此时事务C(300)修改了数据为20,并提交;

当事务B第二次查询时,但200<300<301,说明事务C是和事务B在同一时间段执行的,B就不能读到C的数据,通过 undo log版本链,此时读到的数据还是之前的18;

总之:ReadView保证可重复读,通过逻辑判断的非阻塞同步机制

mysql事务的本质:多线程访问同一资源的彼此之间的排序规则

控制事务的底层机制就是锁

锁的底层是MVCC

MVCC使用的是MySQL的Undolog(回滚日志)

文章来源:https://blog.csdn.net/jjjjjkkkl/article/details/135709224
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。