本节主要介绍 OceanBase 数据库的隔离级别及其设置方法。

ANSI 和 ISO/IEC 基于 SQL 标准定义了四种隔离级别,OceanBase 数据库目前支持了以下几种隔离级别:

  • MySQL 模式

    • 读已提交(Read Committed)

    • 可重复读(Repeatable Read)

  • Oracle 模式

    • 读已提交(Read Committed)

    • 可重复读(Repeatable Read)

    • 可串行化(Serializable)

OceanBase 数据库默认的隔离级别为读已提交(Read Committed)。

设置隔离级别

设置隔离级别的方式有两种,分别为事务级别及 Session 级别:

  • 事务级别

    1. obclient> SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
  • Session 级别

    1. obclient> ALTER SESSION SET ISOLATION_LEVEL = SERIALIZABLE;

设置事务的隔离级别时,应注意以下事项:

  • 不能在事务的执行过程中设置事务的隔离级别,否则会报以下错误。

    1. ERROR:ORA-01453: SET TRANSACTION must be first statement of transaction
  • Oracle 租户开启可串行化隔离级别时,需要确保全局时间戳服务(Global Timestamp Service,简称 GTS)为开启状态。

    您可以执行以下语句,查看并开启 GTS 。

    1. obclient> SHOW VARIABLES LIKE 'ob_timestamp_service';
    2. obclient> SET GLOBAL ob_timestamp_service=GTS;
  • Session 需要维护 Session 级别的事务隔离级别,在开启事务时需要获取 Session 级别的事务隔离级别。该隔离级别可以被 事务级别的隔离级别覆盖。

    查看当前事务隔离级别的语句如下:

    1. obclient> SHOW VARIABLES LIKE 'tx_isolation';

使用限制

  • 内部事务

    由用户事务触发的内部事务,以及维护内部表信息的事务都称为内部事务,内部事务采用 Read Committed 隔离级 别。

  • 跨租户事务

    由于当前有一些内部表尚未拆分到普通租户下,有可能存在跨租户的事务。Oracle 租户在可串行化隔离级别下不允许执行跨 租户的事务。