MyRocks_zh_doc

事务隔离级别

MyRocks中事务隔离级别

概览

MyRocks支持4种隔离级别中的两种: Read Committed 读取已提交 和 Repeatable Read 可重复读取(https://en.wikipedia.org/wiki/Isolation_(database_systems)#Isolation_levels)

这些隔离级别模式使用快照。快照是RocksDB对象,可以从特定时间点查看数据库的一致视图。
对于SELECT查询,课件的数据始终是创建快照时存在的数据。对于INSERT/UPDATE,如果尝试更改自创建快照以来另一个连接以更改的行,则会生成错误。

在可重复读取模式下,将在事务持续时间内保留快照,因此事务中的所有语句都会看到数据库相同的试图。
在读取已提交模式下,快照将在语句的持续时间内保留,因此每个语句都可以看到在语句启动之前发生的任何改变,从那时起没有任何改变。

MyRocks和其他数据库系统之间的差异

由于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。