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支援請進行實際業務測試。
如果一個事務中,既有寫入又有查詢,查詢效能會低於不使用事務,具體效能損失請以實際為準。
同一個事務中,讀、寫、刪除、更新等請求均在表層級加寫鎖,會導致同一個表的多個事務只能串列執行,樣本如下。
當前混合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;