2.快照读和当前读多版本并发控制,通过数据行的多个版本来实现数据库的并发控制。为了查询一些正在被其他事务更新的行被更新之前的数据值。这样查询就不用等其他事务释放锁。
2.1 快照读:
不加锁的非阻塞读,读的是快照的内容(比如不加锁的select *** 作)快照读式基于MVCC,避免了锁 *** 作快照读基于MVCC,有多个版本,读取的可能不是最新的版本隔离级别不能式串行,否则会退化成当前读
2.2 当前读:
阻塞式的读,读的是记录的最新版本当前读要保证其他事务不能修改当前记录会对当前记录加锁
2.3 mysql里的可重复读其实已经解决了幻读
3.MVCC的实现:依赖于:隐藏字段、Undo Log 、readView
1、 隐藏字段 :
rowId
Innodb采用主键索引(聚簇索引),会利用主键维护索引,若表没有主键,就用第一个非空唯一索引,若没有唯一索引,则用row_id这个隐藏字段作为主键索引。
事务id(trx_id):
每次事务对记录进行修改,都会把当前事务id赋值给 trx_id(修改 *** 作trx_id每次递增,读 *** 作trx_id为0)
回滚指针(roll_pointer)
undo log会记录老版本的记录,然后回滚指针执行老版本的位置
2、Undo Log版本链
3.MVCC实现原理
readview
readview规则:
整体 *** 作流程
read committed 隔离级别的时候,每一次select 都会重新获取一个read view
repeatable read 隔离级别下,只在第一次读的时候获取一次read view
readview主要解决版本链中哪些版本是对当前事务可见的。
readview主要针对read committed和repeatable read(他们有历史版本,其他两个都是读最新版本)
总结:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)