刚开始写博客.. 写的太low。
1、数据库的两种读,每种读读的数据版本不一样,所以也成为MVCC
a) 快照读
select * from where xxx 这种形式的都是快照读。
如果读取的行数据,没有被锁定,就会返回查询行;如果数据行被锁定就会直接返回数据行的历史版本(历史版本在undo 日志里面)
b) 当前读
update , insert ,delete ,select xx from xx for update , in share mode 都是当前读
当前读会等待,不会返回数据的历史版本
2、mvcc 的实现原理
mvcc是基于read view、活跃事务列表 做的,以后的文章我会专门分析这块。
3、mysql 是如何解决脏读的
扫描二维码关注公众号,回复:
2339898 查看本文章
在 快照读下是用的mvcc 做的,当前读使用 行级锁做的
4、mysql 是如何解不可重复读、幻读
在 快照读下是用的mvcc 做的,当前读使用 next key locking 做的
总结:有的书上在介绍隔离级别怎么实现的,有的只说mvcc , 有的只说锁,说的都不全面。
应该从当前读和快照读的角度去分析。快照读是用的mvcc,当前读是基于锁。