根据SQL标准,可重复读取应该防止模糊读取和脏读取,而Serializable也应该防止幻读。
默认情况下,InnoDB在REPEATABLE READ事务隔离中运行 水平。在这种情况下,InnoDB使用下一键锁进行搜索和索引 扫描,防止幻像行(参见第14.2.2.5节“避免 使用下一键锁定的幻像问题“)。
因此,如果Repeatable Read也可以阻止幻像读取,那么Serializable提供什么呢?
Serializable是否可以防止写入偏斜或读取偏斜,而“可重复读取”是不是?
答案 0 :(得分:3)
答案也可以在mysql documentation中找到,引用:
此级别类似于REPEATABLE READ,但InnoDB隐式将所有普通SELECT语句转换为SELECT ...如果禁用自动提交,则锁定共享模式。如果启用了自动提交,则SELECT是其自己的事务。因此,已知它是只读的,并且如果作为一致(非锁定)读取执行则可以序列化,并且不需要阻止其他事务。
当使用两阶段锁定实现时,可序列化的事务调度可防止读写偏斜。这就是它如何在SQL Server上使用锁定或在PostgreSQL上使用其可序列化快照隔离。
如果在正在读取的任何资源上获取共享锁,则也会阻止读取偏斜和写入偏斜。