SQL トランザクション
シンプル SQL トランザクションを開始し、複数の DML ステートメントをバッチでコミットする。
概要
v3.5.0 から、StarRocks は SQL トランザクションをサポートし、複数のテーブル内のデータを操作する際の更新対象テーブルの原子性を保証します。
トランザクションは、同じ原子単位内で処理される複数の SQL ステートメントで構成されます。トランザクション内のステートメントは一緒に適用されるか、元に戻されるため、トランザクションの ACID (原子性、一貫性、分離性、永続性) 特性が保証されます。
現在、StarRocks の SQL トランザクションでは以下の操作をサポートしています:
- INSERT INTO
- UPDATE
- DELETE
- INSERT OVERWRITE は現在サポートされていません。
- トランザクション内で同一テーブルに対する複数の INSERT ステートメントは、v4.0 以降の共有データクラスターでのみサポートされます。
- UPDATE および DELETE は、v4.0 以降の共有データクラスターでのみサポートされています。
v4.0 以降、1 つの SQL トランザクション内では:
- 同一テーブルに対する複数の INSERT ステートメントがサポートされます。
- 同一テーブルに対する UPDATE または DELETE ステートメントは 1 つだけ許可されます。
- 同一テーブルに対する INSERT ステートメントの後に UPDATE ステートメントまたは DELETE ステートメントを実行することは許可されません。
トランザクションの ACID 特性は、限定された READ COMMITTED 分離レベルでのみ保証されます。つまり:
- ステートメントは、ステートメントが開始される前にコミットされたデータのみに対して操作を行います。
- 同じトランザクション内の連続する 2 つのステートメントは、最初のステートメントと 2 番目のステートメントの実行の間に別のトランザクションがコミットされた場合、異なるデータに対して操作を行う可能性があります。
- 前の DML ステートメントによるデータの変更は、同じトランザクション内の後続のステートメントには見えません。
トランザクションは単一のセッションに関連付けられています。複数のセッションが同じトランザクションを共有することはできません。
使用法
-
トランザクションは、START TRANSACTION ステートメントを実行することで開始されなければなりません。StarRocks は BEGIN という同義語もサポートしています。
{ START TRANSACTION | BEGIN [ WORK ] }
-
トランザクションを開始した後、トランザクション内で複数の DML ステートメントを定義できます。詳細については、使用上の注意を参照してください。
-
トランザクションは、COMMIT または ROLLBACK を実行することで明示的に終了しなければなりません。
-
トランザクションを適用(コミット)するには、次の構文を使用します:
COMMIT [ WORK ]
-
トランザクションを元に戻す(ロールバック)には、次の構文を使用します:
ROLLBACK [ WORK ]
-
例
-
共有データクラスタにデモテーブル
desT
を作成し、データをロードします。注記この例を共有なしクラスタで試す場合は、ステップ 3 をスキップし、ステップ 4 で INSERT 文を 1 つだけ定義する必要があります。
CREATE TABLE desT (
k int,
v int
) PRIMARY KEY(k);
INSERT INTO desT VALUES
(1,1),
(2,2),
(3,3); -
トランザクションを開始する。
START TRANSACTION;
または
BEGIN WORK;
-
1 つの UPDATE または DELETE ステートメントを定義する。
UPDATE desT SET v = v + 1 WHERE k = 1,
または
DELETE FROM desT WHERE k = 1;
-
複数の INSERT ステートメントを定義する。
-- 指定された値でデータを挿入する。
INSERT INTO desT VALUES (4,4);
-- ネイティブテーブルから別のテーブルへデータを挿入する。
INSERT INTO desT SELECT * FROM srcT;
-- リモートストレージからデータを挿入する。
INSERT INTO desT
SELECT * FROM FILES(
"path" = "s3://inserttest/parquet/srcT.parquet",
"format" = "parquet",
"aws.s3.access_key" = "XXXXXXXXXX",
"aws.s3.secret_key" = "YYYYYYYYYY",
"aws.s3.region" = "us-west-2"
); -
トランザクションを適用または元に戻す。
-
トランザクション内の SQL ステートメントを適用する。
COMMIT WORK;
-
トランザクション内の SQL ステートメントを元に戻す。
ROLLBACK WORK;
-
使用上の注意
- 現在、StarRocks は SQL トランザクション内で SELECT、INSERT、UPDATE、DELETE ステートメントをサポートしています。UPDATE および DELETE は、v4.0 以降の共有データクラスターでのみサポートされています。
- 同一トランザクション内でデータが変更されたテーブルに対する SELECT ステートメントは許可されません。
- トランザクション内で同一テーブルに対する複数の INSERT ステートメントは、v4.0 以降の共有データクラスターでのみサポートされます。
- トランザクション内では、各テーブルに対して UPDATE または DELETE ステートメントを 1 つだけ定義でき、INSERT ステートメントの前に定義する必要があります。
- 同一トランザクション内で、後続の DML ステートメントは先行ステートメントによる未コミットの変更を読み取れません。例えば、先行 INSERT ステートメントの対象テーブルを後続ステートメントのソーステーブルに指定できません。違反するとエラーが発生します。
- トランザクション内の全 DML ステートメントの対象テーブルは同一データベース内に存在する必要があります。クロスデータベース操作は許可されません。
- 現在、INSERT OVERWRITE はサポートされていません。
- トランザクションのネストは許可されていません。BEGIN-COMMIT/ROLLBACK ペア内で BEGIN WORK を指定することはできません。
- 進行中のトランザクションが属するセッションが終了または閉じられた場合、トランザクションは自動的にロールバックされます。
- StarRocks は、上記のようにトランザクション分離レベルとして限定された READ COMMITTED のみをサポートしています。
- 書き込み競合のチェックはサポートされていません。2 つのトランザクションが同時に同じテーブルに書き込む場合、両方のトランザクションは正常にコミットされる可能性があります。データ変更の可視性(順序)は、COMMIT WORK ステートメントの実行順序に依存します。