前置知识
针对于事务隔离的具体原理需要了解一些概念和知识。
首先 MySQL 的每条记录都会有两个隐藏字段,row_trx_id(事务 id)和roll_pointer(回滚指针)。
row_trx_id 会记录当前记录被哪条事务所更改/创建,记录事务的 id。
roll_pointer 会记录上一版本的数据的地址。
进行数据更改时,会记录三个日志文件:
redo log 解决数据库宕机重启丢失数据的问题。
binlog 用于主从复制、数据备份操作。
undo log 实现事务回滚操作。
undo log 版本链:作用时回溯当前事务能够读取的数据。
undo log 会记录对数据操作的事务 id,修改后的数据和回滚指针。
进行数据更新时,记录事务id,记录修改数,回滚指针指向上一版本。
ReadView 记录中四个重要属性:
- creator_trx_id 当前事务id。
- m_ids 当前系统中所有开启了但未提交事务的id。
- min_trx_id 当前系统所有开启但未提交事务中 事务 id最小的。
- max_trx_id 当前系统中事务 id 最大的值 +1,也就是系统下一个要生成的事务 id。
事务可见性:
当前事务为 A。
- 记录的事务 id 小于 min_trx_id 时,A 能看见(说明更新该数据的事务在 A 开启前就已经提交)。
- 记录的事务 id 大于等于 max_trx_id ,A 无法看见&#