Hologres は、完全なデータ定義言語(DDL)トランザクションおよび部分的なデータ操作言語(DML)トランザクションをサポートしています。デフォルトでは、Hologres は単一の 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 トランザクション(ベータ版)
Hologres V2.0 以降のバージョンでは、同一トランザクション内で混合 DML 文をサポートしています。この機能により、特にデータ書き込み時の混合 DML 操作の原子性および一貫性が保証され、Hologres は軽量トランザクション処理(TP)シナリオに適しています。ただし、トランザクションに混合 DML 文が含まれる場合、Hologres の分散機能を十分に活用できません。そのため、混合 DML 文は高いクエリ毎秒(QPS)シナリオには対応していません。
-
シナリオ: 同一トランザクション内で混合 DML 文を使用し、データの書き込み、更新、削除の一貫性を保証します。
-
注意事項:
-
混合 DML トランザクションは低 QPS シナリオのみをサポートしており、高い同時実行性の状況には適していません。サポートされる具体的な QPS 値を確認するには、必要に応じてテストを実施してください。
-
トランザクションに書き込み操作とクエリ操作の両方が含まれる場合、トランザクションを使用しない場合と比べてクエリ性能が低下します。実際の性能劣化はシナリオによって異なります。
-
同一トランザクション内では、読み取り、書き込み、削除、更新のすべての操作がテーブルレベルの書き込みロックを取得します。これにより、同一テーブルに対する複数のトランザクションは逐次的に実行されます。例:
重要注: ロックは書き込み対象のテーブルだけでなく、クエリ対象のテーブルにも取得されます。例:
-
ユーザー A が以下の SQL を実行します。
SET hg_experimental_enable_transaction = on; BEGIN; DELETE FROM dml_test; INSERT INTO dml_test SELECT * FROM base_tbl; COMMIT; -
ユーザー B が以下の SQL を実行します。
SET hg_experimental_enable_transaction = on; BEGIN; DELETE FROM dml_test_2; INSERT INTO dml_test_2 SELECT * FROM base_tbl; COMMIT;
この場合、`base_tbl` もロックされます。ユーザー B が送信した SQL 文は、ユーザー A が送信した SQL 文の完了を待ってから実行されます。そのため、複数の DML 文に対してトランザクションを有効にした後、競合が発生すると SQL の実行時間が大幅に増加し、タイムアウト設定によりエラーが発生する可能性もあります。
-
-
-
使用方法
混合 DML 文に対するトランザクションはデフォルトで無効になっています。以下の Grand Unified Configuration(GUC)パラメーターを使用して、この機能を有効にできます。
SET hg_experimental_enable_transaction = on;この機能を有効にすると、単一のトランザクションに複数の 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;