SQL事务能力

Hologres支持完整的DDL事务以及部分DML事务,默认支持单条SQL事务。本文将会为您介绍Hologres的事务支持能力。

事务的支持场景

Hologres对事务的支持场景和使用说明如下:

  • 支持多条DDL语句事务

    事务内多个表的创建与回滚支持事务保障,示例如下:

    begin;
    drop table if exists  ddl_test;
    create table ddl_test(
              uid   text not null,
              name  text not null);
    commit;
  • 支持多条DML混合事务(Beta)

    Hologres从V2.0版本开始支持同一个事务内的混合DML。通过混合DML事务的支持,可以保证同一个SQL中混合DML的原子性和一致性,尤其使数据写入时能保证一致性,从而使得Hologres也适用轻TP的场景。但需要注意的是:一个事务中如果有混合DML,无法最大程度的利用Hologres的分布式能力,会使得混合DML无法支撑高QPS的场景。

    • 应用场景:混合DML在同一个事务中,可以保证数据写入、更新、删除的一致性。

    • 注意事项:

      • 混合DML事务只支持低QPS场景,不适用于高并发场合,具体QPS支持请进行实际业务测试。

      • 如果一个事务中,既有写入又有查询,查询性能会低于不使用事务,具体性能损失请以实际为准。

      • 同一个事务中,读、写、删除、更新等请求均在表级别加写锁,会导致同一个表的多个事务只能串行执行,示例如下。image

      • 当前混合DML事务存在已知问题:在混合DML事务中,如果对DML语句执行Cancel操作之后进行Rollback,引擎中事务会有残留,对应的表级别锁不会被释放。示例如下:

        set hg_experimental_enable_transaction = on;
        begin;
        insert into dml_test select i from generate_series(1,100000) t(i);
        -- 对insert into执行cancel
        rollback;
        -- dml_test被锁住
    • 使用说明:

      目前混合DML事务默认关闭,需要通过如下GUC参数开启:

      set hg_experimental_enable_transaction = on;

      开启混合DML事务后,在一个事务中可包含多个DML:

      • 如果其中一个DML失败,那么系统会自动将事务内的DML进行回滚,其余DML会自动失败。

      • 如果DML正在正常执行中,因为某种原因想回滚,可以对事务执行回滚,这样就会自动将事务中的DML回滚。

        set hg_experimental_enable_transaction = on;
        begin ;
        delete from dml_test;
        insert into dml_test values (1,'sss');
        rollback;
  • 暂不支持DDL和DML混合事务。

    如下示例,DDL和DML在同一个事务中会报错:ERROR: INSERT in ddl transaction is not supported now

    begin;
    drop table if exists dml_test;
    create table dml_test
    (
              uid   text not null,
              name  text not null);
    insert into dml_test values('1','tom');
    commit;