Mvcc--mysql详解(十一)
上篇文章说了为了解决mysql原子性,于是undo日志来记录需要回滚的数据,首先回滚不需要考虑select,每行数据都有roll_pointer指针,指向insert undo日志,update和delete与insert是不同的,多一个old_roll_pointer指向需要回滚的日志,update分为主键更新和非主键更新,减少不必要的重排序性能消耗。
Mvcc
全称是multi-version concurrency control,多版本并发控制。
当我们并发执行会发生什么问题呢?
脏读:当一个事务读取了另一个事务里未提交的数据,甚至在另一个事务发生了回滚,这个数据并不存在。
不可重复读:在一个事务里,每次读取都是其他事务最新值,而导致在每次查询的值每次都不一致。
幻读:在一个事务里,每次查询的记录数不一样,有的时候多,有的时候少,针对于新增和删除。(一个事务先查询一些数据,另一个事务又向表里插入新数据,这时候在第一个事务查询的值增多)
四种隔离级别:
Read uncommit:存在以上三个问题。
Read commit:解决脏读。
Repeatable read:解决不可重复读,每次select都是不同的数据,被其他事务所修改。
Serializable:串行化,各种问题都不会发生,效率低。
隔离级别可以通过set transaction isolation level serializable,查看可以用show
Variables like ‘transaction_isolation’;
对于serializable隔离级别的事务,采用的是加锁方式解决的,对于read uncommit、commit、
Repeatable read级别采用的是readView。
M_ids:表示系统中活跃的读写事务id列表。
Min_trx_id:表示活跃中的最小事务id。(m_ids里最小值)
max_trx_id:表示应该分配给下一个事务的id。(不在m_ids里)
Creator_trx_id:表示生成该readView的事务id。
他的过程就是当前事务会与这些字段来判断:
当当前事务小于最小事务id的时候,代表已经被提交,可以被访问。
当当前事务大于最大事务id的时候,表示事务在之后才开启,不可以被访问。
如果在之间,则判断是都在m_ids活跃列表里,在的话不可以访问,不在则可以访问。
Read commit和repeatable不同的是,readview生成时机不同,前者是每次select都会生成readView,后者只有第一次select会生成,后面重复使用。
相关文章
- 实践案例丨云连接CC实现跨区域多VPC与线下IDC Server互联
- 大数据下单集群如何做到2万+规模?
- 释放数据价值:DAYU数据运营新能力解读
- 银行大数据新玩法,构建“一湖两库”金融数据湖
- 微服务架构下,DLI的部署和运维有何奥秘?
- 数据隔离、访问授权,用好大数据为什么这么难?
- 教你用Elastic Search:运行第一条Hello World搜索命令
- Springboot中,如何读取配置文件中的属性
- SparkSQL高并发:读取存储数据库
- 云图说|DDS读写两步走,带您领略只读节点的风采
- 当时间管理碰上大数据,从此,悠悠时光也终不再那么漫长
- 当MySQL执行XA事务时遭遇崩溃,且看华为云如何保障数据一致性
- 分析内部运行机制,教你解决Redis性能问题
- 华为云GaussDB新产品特性亮相DTC2021,重磅新品开源预告
- “数”驰天下,华为云DRS 高效支撑T3出行平稳迁移
- 40张图+万字,从9个数据类型帮你稳稳的拿捏Redis数据结构
- 解析Redis操作五大数据类型常用命令
- 斗罗大陆真3D手游实力上线,带你感受魂兽猎杀的超燃时刻
- 再获信通院权威认证,优等生华为云GaussDB数据库凭什么?
- 云图说|DRS数据对比——带您随时观测数据一致性