可重复读是一种更高的隔离级别,除了保证读提交级别的内容外,还保证任何已读取的数据不会更改。如果事务再次读取相同的数据,则会发现之前读取的数据仍在原处,未更改且可供读取。
这似乎与快照隔离级别非常相似。
可重复读与快照隔离级别有何不同?
可重复读是一种更高的隔离级别,除了保证读提交级别的内容外,还保证任何已读取的数据不会更改。如果事务再次读取相同的数据,则会发现之前读取的数据仍在原处,未更改且可供读取。
这似乎与快照隔离级别非常相似。
可重复读与快照隔离级别有何不同?
“快照”保证事务内的所有查询将看到事务开始时的数据。
“可重复读”仅保证如果事务内的多个查询读取了相同的行,则每次它们都将看到相同的数据。(因此,不同的行可能在不同的时间被拍摄,取决于事务首次检索它们的时间。如果插入新行,则稍后的查询可能会检测到它们。)
快照隔离在PostgreSQL和MySQL中称为“可重复读”,在Oracle DB中称为“可序列化”。IBM DB2使用“可重复读”来指代串行化。
SQL标准没有快照隔离的概念,这是命名混乱的原因。
因此,没有人真正知道可重复读意味着什么。但是,可以合理地假设它们是相同的东西。