本节主要介绍 OceanBase 数据库的隔离级别及其设置方法。
ANSI 和 ISO/IEC 基于 SQL 标准定义了四种隔离级别,OceanBase 数据库目前支持了以下几种隔离级别:
MySQL 模式
读已提交(Read Committed)
可重复读(Repeatable Read)
Oracle 模式
读已提交(Read Committed)
可重复读(Repeatable Read)
可串行化(Serializable)
OceanBase 数据库默认的隔离级别为读已提交(Read Committed)。
设置隔离级别
设置隔离级别的方式有两种,分别为事务级别及 Session 级别:
事务级别
obclient> SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
Session 级别
obclient> ALTER SESSION SET ISOLATION_LEVEL = SERIALIZABLE;
设置事务的隔离级别时,应注意以下事项:
不能在事务的执行过程中设置事务的隔离级别,否则会报以下错误。
ERROR:ORA-01453: SET TRANSACTION must be first statement of transaction
Oracle 租户开启可串行化隔离级别时,需要确保全局时间戳服务(Global Timestamp Service,简称 GTS)为开启状态。
您可以执行以下语句,查看并开启 GTS 。
obclient> SHOW VARIABLES LIKE 'ob_timestamp_service';
obclient> SET GLOBAL ob_timestamp_service=GTS;
Session 需要维护 Session 级别的事务隔离级别,在开启事务时需要获取 Session 级别的事务隔离级别。该隔离级别可以被 事务级别的隔离级别覆盖。
查看当前事务隔离级别的语句如下:
obclient> SHOW VARIABLES LIKE 'tx_isolation';
使用限制
内部事务
由用户事务触发的内部事务,以及维护内部表信息的事务都称为内部事务,内部事务采用 Read Committed 隔离级 别。
跨租户事务
由于当前有一些内部表尚未拆分到普通租户下,有可能存在跨租户的事务。Oracle 租户在可串行化隔离级别下不允许执行跨 租户的事务。