什么是可重复读取和Serializable的MySQL InnoDB实现之间的实际区别

时间:2015-10-14 05:50:54

标签: mysql transactions isolation-level

根据SQL标准,可重复读取应该防止模糊读取和脏读取,而Serializable也应该防止幻读。

根据MySQL documentation

  

默认情况下,InnoDB在REPEATABLE READ事务隔离中运行   水平。在这种情况下,InnoDB使用下一键锁进行搜索和索引   扫描,防止幻像行(参见第14.2.2.5节“避免   使用下一键锁定的幻像问题“)。

因此,如果Repeatable Read也可以阻止幻像读取,那么Serializable提供什么呢?

Serializable是否可以防止写入偏斜或读取偏斜,而“可重复读取”是不是?

1 个答案:

答案 0 :(得分:3)

答案也可以在mysql documentation中找到,引用:

  

此级别类似于REPEATABLE READ,但InnoDB隐式将所有普通SELECT语句转换为SELECT ...如果禁用自动提交,则锁定共享模式。如果启用了自动提交,则SELECT是其自己的事务。因此,已知它是只读的,并且如果作为一致(非锁定)读取执行则可以序列化,并且不需要阻止其他事务。

当使用两阶段锁定实现时,可序列化的事务调度可防止读写偏斜。这就是它如何在SQL Server上使用锁定或在PostgreSQL上使用其可序列化快照隔离。

如果在正在读取的任何资源上获取共享锁,则也会阻止读取偏斜和写入偏斜。