全部產品
Search
文件中心

Hologres:SQL事務能力

更新時間:Jun 30, 2024

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;