MVCC
保证事务的隔离性
排它锁:
一个事务获取了数据行的排他锁,其他事务就不能再获取该行的其他锁
MVCC:
多版本并发控制
维护一个数据的多个版本,使读写不存在冲突
具体实现依靠
隐藏字段
mysql中隐藏了三个隐藏字段
db_trx_id:最近修改事务
db_roll_ptr:指向上一个版本
db_row_id:隐藏主键
回滚日志:undolog
修改数据库产生的回滚日志,会记录最近修改前的数据
undolog版本链:开启事务后
记录最近修改事务
回滚指针指向上一个版本
readview:读视图
快照读sql执行时MVCC提取数据的依据,记录并维护系统当前活跃的事务的id
当前读
读记录的最新版本,对读记录进行加锁,确保读到最新数据
快照读
读记录的可见版本,可能是历史数据,不加锁,非阻塞
在不同隔离级别中生成快照的时机不同
readview中有四个核心字段
m_ids:当前活跃(没提交的)的事务id集合
min_trx_id:最小的活跃事务id
max_trx_id:预分配的事务id,当前最大事务id+1(下一个分配的事务id)
creator_trx_id:readview创建者的事务id
版本链的访问规则
trx_id:当前的事务id
trx_id == creator_trx_id 可访问
trx_id < min_trx_id 可访问
trx_id >max_trx_id 不可访问
在最小id和最大id之间也可以访问
不同隔离级别下生成ReadView的时机也不同
read committed:在事务每一次执行快照读时生成ReadView
repeated read:仅在事务第一次执行快照读时生成ReadView,后续复用这个ReadView
通过每次生成的读视图,查询不同版本的事务,最终找到一个可访问的最新版本