適用対象:
Databricks SQL
コミットまたはロールバックできる単一の作業単位に複数の SQL ステートメントをグループ化する新しい対話型トランザクションを開始します。
対話型トランザクションの代わりに、 BEGIN ATOMIC ... END; 構文を使用して非対話型トランザクションを定義できます。
ATOMIC 複合ステートメントを参照してください。
構文
BEGIN { TRANSACTION | WORK }
パラメーター
このステートメントにはパラメーターがありません。
メモ
- 対話型トランザクションが既にアクティブな場合、
BEGIN TRANSACTIONをもう一度実行するとTRANSACTION_NOT_SUPPORTED.NESTED_TRANSACTIONエラーが発生します。 対話型トランザクションでは、入れ子はサポートされていません。 -
BEGIN TRANSACTIONとBEGIN WORKは同等の構文の代替手段です。
例示
次の例は、一般的な対話型トランザクション パターンを示しています。
基本的なクロステーブル トランザクション
各ステートメントを個別に実行します。
BEGIN TRANSACTION;
-- Insert a new record
INSERT INTO my_table VALUES (1, 'test');
-- Update records in another table
UPDATE another_table
SET value = 'updated'
WHERE id = 5;
-- Commit all changes in both tables atomically
COMMIT TRANSACTION;
自己の書き込みを読み取る
各ステートメントを個別に実行します。
BEGIN TRANSACTION;
-- Insert new data
INSERT INTO customers VALUES (101, 'New Customer');
-- Query can see the inserted data within the same transaction
SELECT * FROM customers WHERE id = 101;
-- Returns the newly inserted row even though it's not yet committed
-- Update the newly inserted data
UPDATE customers SET name = 'Updated Customer Name' WHERE id = 101;
-- Query sees the updated value
SELECT name FROM customers WHERE id = 101;
-- Returns 'Updated Customer Name'
-- Commit makes changes visible to other transactions
COMMIT TRANSACTION;
ロールバックを伴うトランザクション
各ステートメントを個別に実行します。
BEGIN TRANSACTION;
-- Attempt an insert operation
INSERT INTO my_table VALUES (1, 'incorrect-value');
-- After discovering the mistake, rollback the transaction
-- (no changes are actually made to the tables)
ROLLBACK TRANSACTION;
コミットされていない変更の可視性
この例では、トランザクション内の変更は、トランザクションがコミットされるまで他のセッションには表示されません。 各ステートメントを個別に実行します。
セッション 1:
BEGIN TRANSACTION;
-- Insert new data
INSERT INTO products VALUES (999, 'New Product', 29.99);
-- At this point, Session 2 cannot see this data
-- You can see your own changes
SELECT * FROM products WHERE id = 999;
-- Returns the new product
セッション 2 (同時):
-- This query does not see the uncommitted data from Session 1
SELECT * FROM products WHERE id = 999;
-- Returns no rows
セッション 1 (続き):
-- Now commit the transaction
COMMIT TRANSACTION;
セッション 2 (コミット後):
-- Now the query can see the committed data
SELECT * FROM products WHERE id = 999;
-- Returns the new product
同時変更の可視性
この例では、トランザクションの外部で同時に行われた変更は、トランザクションには表示されません。 Azure Databricks では、最初のアクセス時に各テーブルの一貫性のあるスナップショットがキャプチャされ、そのテーブルの後続のすべての読み取りでは、このスナップショット (反復可能な読み取り) が使用されます。 各ステートメントを個別に実行します。
セッション 1 (トランザクションを開始し、テーブルを読み取ります):
BEGIN TRANSACTION;
-- Read the table; captures a snapshot of orders at this point
SELECT COUNT(*) FROM orders;
-- Returns: 1
セッション 2 (同時セッションによって行が追加されます):
INSERT INTO orders VALUES (2, 'Product B', 75.00);
COMMIT;
セッション 1 (続けて、テーブルを再読み取り):
-- Still reads from the original snapshot; the new row is not visible
SELECT COUNT(*) FROM orders;
-- Returns: 1 (unchanged, even though Session 2 committed a new row)
COMMIT;
これにより、同時変更に関係なく、トランザクション全体で一貫した読み取りが保証されます。
関連資料
- ATOMIC 複合ステートメント (非対話型トランザクション):自動コミットとロールバックを使用して、複数の SQL ステートメントを 1 つのアトミック トランザクションとして実行します
- COMMIT: 対話型トランザクションをコミットし、すべての変更を永続的にする
- ROLLBACK: 対話型トランザクションをロールバックし、すべての変更を破棄する
- トランザクション: トランザクションのサポート、要件、および制限の概要
- トランザクション モード: 非対話型トランザクションと対話型トランザクションの詳細なパターンと例
- BEGIN END 複合文: キーワードのないブロック