MyRocks支持4种隔离级别中的两种: Read Committed 读取已提交 和 Repeatable Read 可重复读取(https://en.wikipedia.org/wiki/Isolation_(database_systems)#Isolation_levels)
这些隔离级别模式使用快照。快照是RocksDB对象,可以从特定时间点查看数据库的一致视图。
对于SELECT查询,课件的数据始终是创建快照时存在的数据。对于INSERT/UPDATE,如果尝试更改自创建快照以来另一个连接以更改的行,则会生成错误。
在可重复读取模式下,将在事务持续时间内保留快照,因此事务中的所有语句都会看到数据库相同的试图。
在读取已提交模式下,快照将在语句的持续时间内保留,因此每个语句都可以看到在语句启动之前发生的任何改变,从那时起没有任何改变。
由于MyRocks实现这些事务隔离级别的方式,MyRocks和其他数据库系统之间可能存在各种差异。
MyRocks视图尽可能地延迟拍摄快照的时间点。这种影响将以可重复读取模式显示。在某些数据库系统中,事务只能看到事务开始之前发生的改变。
在MyRocks中,我们延迟快照的开始,直到读取第一个数据,在这事务开始后的某个时间发生。这意味着以下场景可能会得到不同的结果。
<client 1> | <client 2>
CREATE TABLE t1(pk INT PRIMARY KEY); |
INSERT INTO t1 VALUES(1); |
SET SESSION TRANSACTION ISOLATION LEVEL |
REPEATABLE READ; |
| SET SESSION TRANSACTION ISOLATION LEVEL
| REPEATABLE READ;
BEGIN |
| INSERT INTO t1 VALUES(2);
SELECT COUNT(*) FROM t1 |
在MyRocks上,结果将是2,而在其他系统上,它可能是1。