MVCC多版本并发控制(隐藏列/ReadView)
2021-02-26 15:30:36 3 举报
AI智能生成
为你推荐
查看更多
MVCC多版本并发控制(隐藏列/ReadView)
作者其他创作
大纲/内容
喜欢收藏+点赞👍 谢谢
多版本并发控制,通过维护数据历史版本(版本链),从而解决并发访问情况下的读一致性问题
核心条件
事务版本号
每次事务开启前都会从数据库获得一个自增长的事务ID,可以从事务ID判断事务的执行先后顺序
表的隐藏列
trx_id:数据事务ID(记录操作该数据事务的事务ID)
roll_pointer:回滚指针(指向上一个版本数据在 undo log 里位置的指针)
row_id:隐藏ID(当创建表没有合适的索引作为聚集索引时,会用该隐藏ID创建聚集索引)
delete mark:删除标识
ReadView
重要属性
trx_ids: 当前系统活跃(未提交)事务版本号集合
min_trx_id:创建当前read view 时“系统正处于活跃事务最小版本号”
max_trx_id:创建当前read view 时“当前系统最大事务版本号+1”
creator_trx_id:创建当前read view的事务版本号
匹配条件
数据事务ID < read view 中的最小活跃事务ID,该数据在readview中可见
数据事务ID >= read view 中的最大事务ID,数据不可见
数据事务ID介于两者之间
如果事务ID不存在于trx_ids 集合
可见
事务ID存在trx_ids 且等于creator_trx_id
事务ID存在trx_ids 不等于creator_trx_id
不可见
不满足read view条件(数据不可见时),从undo log中获取数据
undo log
记录数据被修改之前的日志,表信息修改之前先会把数据拷贝到 undo log 里
用途
保证事务进行rollback时的原子性和一致性
用于MVCC快照读
扩展
insert undo:事务提交即释放
update undo:需要支持MVCC,不能立即删除
主要解决
读已提交:每次读取数据前都会生成一个ReadView,保证每次都能读到其它事务已提交的数据
可重复读:只在第一次读取数据时生成一个ReadView,这样就能保证后续读取的结果完全一致
读未提交
读取版本链中最新版本的记录即可
串行化
事务之间是加锁执行的,不存在读不一致的问题
MVCC是否能解决幻读问题?
基于MVCC的快照读可避免幻读问题
当前读的情况下MySQL默认加锁来解决(间隙锁)
日志
undo log:回滚日志
作用:用于回滚,同时可以提供多版本并发控制下的读(MVCC),也即非锁定读
事务开始之前产生,事务提交之后不是立马删除,而是放入待清理链表,由清除线程判断
redo log:重做日志
作用:用于奔溃恢复,记录事务对数据库做了哪些修改,确保事务的持久性
事务开始之后产生,当对应事务的脏页写入到磁盘之后释放
binlog:二进制日志
作用:记录对数据库执行更改的所有操作
事务提交的时候一次性将事务中的sql记录到binlog中,在生成时间超过expire_logs_days配置的天数后自动删除
errorlog:错误日志
记录出错信息,也记录一些警告信息和正确信息
slow query log:慢查询日志
设置一个阈值,将运行时间超过该值的所有SQL语句都记录到慢查询日志文件中
general log:一般查询日志
记录所有对数据请求的信息,不论这些请求是否被正确执行
relay log:中继日志
中继日志也是二进制日志,用来给slave库恢复
0 条评论
回复 删除
下一页