Mysql-八股文

194 阅读2分钟

1. Mysql在RR隔离级别下,是如何解决幻读的以及哪些幻读不能解决?

如何解决幻读?
MVCC + 间隙锁或临键锁。
    MVCC:RR隔离级别下,同一个事务 在第一次读取数据时生成一个readview,之后的查询不会重复生成readview,所以仅快照读不会出现幻读问题(因为读的都一个readView).
    锁定读:RR隔离级别下,同一个事务,仅当前读的情况下通过加临键锁或间隙锁,其他事务修改、插入数据会阻塞,这种仅当前读场景也不会出现幻读。
哪些幻读不能解决:
    RR在都是当前读或都是快照读的场景下,是解决幻读的,只有在一个事务里既有快照读又有当前读才有可能出现幻读。前提是在发生当前读之前有其它事务插入或删除了数据并提交了(由于当前事务是快照读所以不能阻塞其它事务的变更),这个时候当前事务就出现了幻读。所以,如果一个事务里既有快照读又有当前读,最好的方式是全部转为当前读,即所有select都加上for update。
当前读:select for updateselect LOCK IN SHARE MODE 、 insert\delete\update
当前读会加锁,先默认是临键锁 然后根据某种条件转化为记录锁或者间隙锁。
幻读未解决的场景:
(只能解决部分幻读,比如A事物快照读方式查询,B事物insert,A事物再查询一次,此时A的两次查询结果是相同的。但是假如A事物先查询一次,结果为1,B事物更新这条数据值为2,A事物再更新该字段=原值+1,A事物再查询一次,发现结果等于3了,而不是等于2,这种幻读就解决不了。)

参考文献-间隙锁加锁规则
MVCC能否解决幻读

2. mysql哪些查询情况不走索引

3. mysql innodb存储引擎关键特性

4. 快照是什么

与备份数据库复制整个数据库不同,快照并不复制整个数据库的页,而是仅仅复制在快照建立时间点之后改变的页。因此,当利用快照进行数据库恢复时,也仅仅将那些做出改变的页恢复到源数据库,这个速度无疑会大大高于备份和恢复方式