SQL トランザクション
このトピックでは、複数の INSERT ステートメントをバッチでコミットするためのシンプルな SQL トランザクションの開始方法について説明します。
概要
v3.5.0 から、StarRocks は SQL トランザクションをサポートし、複数のテーブルにデータをロードする際に更新されたテーブルの原子性を保証します。
トランザクションは、同じ原子単位内で処理される複数の SQL ステートメントで構成されます。トランザクション内のステートメントは一緒に適用されるか、元に戻されるため、トランザクションの ACID (原子性、一貫性、分離性、永続性) 特性が保証されます。
現在、StarRocks の SQL トランザクションは INSERT を介したロード操作のみをサポートしており、同じテーブルに対する複数の INSERT ステートメントは許可されていません。トランザクションの ACID 特性は、限定された READ COMMITTED 分離レベルでのみ保証されます。つまり:
- ステートメントは、ステートメントが開始される前にコミットされたデータのみに対して操作を行います。
- 同じトランザクション内の連続する 2 つのステートメントは、最初のステートメントと 2 番目のステートメントの実行の間に別のトランザクションがコミットされた場合、異なるデータに対して操作を行う可能性があります。
- 前の DML ステートメントによるデータの変更は、同じトランザクション内の後続のステートメントには見えません。
トランザクションは単一のセッションに関連付けられています。複数のセッションが同じトランザクションを共有することはできません。
使用法
-
トランザクションは、START TRANSACTION ステートメントを実行することで開始されなければなりません。StarRocks は BEGIN という同義語もサポートしています。
{ START TRANSACTION | BEGIN [ WORK ] }
-
トランザクションを開始した後、トランザクション内で複数の INSERT ステートメントを定義できます。詳細については、使用上の注意を参照してください。
-
トランザクションは、COMMIT または ROLLBACK を実行することで明示的に終了しなければなりません。
-
トランザクションを適用(コミット)するには、次の構文を使用します:
COMMIT [ WORK ]
-
トランザクションを元に戻す(ロールバック)には、次の構文を使用します:
ROLLBACK [ WORK ]
-
例
BEGIN WORK;
INSERT INTO source_wiki_edit
WITH LABEL insert_load_wikipedia
VALUES
("2015-09-12 00:00:00","#en.wikipedia","AustinFF",0,0,0,0,0,21,5,0),
("2015-09-12 00:00:00","#ca.wikipedia","helloSR",0,1,0,1,0,3,23,0);
INSERT INTO insert_wiki_edit
SELECT * FROM FILES(
"path" = "s3://inserttest/parquet/insert_wiki_edit_append.parquet",
"format" = "parquet",
"aws.s3.access_key" = "XXXXXXXXXX",
"aws.s3.secret_key" = "YYYYYYYYYY",
"aws.s3.region" = "us-west-2"
);
COMMIT WORK;
使用上の注意
- 現在、StarRocks は SQL トランザクションで INSERT および SELECT ステートメントのみをサポートしています。
- トランザクション内の DML ステートメントのすべての対象テーブルは、同じデータベース内になければなりません。
- トランザクション内で同じテーブルに対する複数の INSERT ステートメントは許可されていません。
- トランザクションのネストは許可されていません。BEGIN-COMMIT/ROLLBACK ペア内で BEGIN WORK を指定することはできません。
- 進行中のトランザクションが属するセッションが終了または閉じられた場合、トランザクションは自動的にロールバックされます。
- StarRocks は、上記のようにトランザクション分離レベルとして限定された READ COMMITTED のみをサポートしています。
- 書き込み競合のチェックはサポートされていません。2 つのトランザクションが同時に同じテーブルに書き込む場合、両方のトランザクションは正常にコミットされる可能性があります。データ変更の可視性(順序)は、COMMIT WORK ステートメントの実行順序に依存します。