次の方法で共有


トランザクション開始

適用対象: チェック マークあり Databricks SQL

コミットまたはロールバックできる単一の作業単位に複数の SQL ステートメントをグループ化する新しい対話型トランザクションを開始します。

対話型トランザクションの代わりに、 BEGIN ATOMIC ... END; 構文を使用して非対話型トランザクションを定義できます。 ATOMIC 複合ステートメントを参照してください。

構文

BEGIN { TRANSACTION | WORK }

パラメーター

このステートメントにはパラメーターがありません。

メモ

  • 対話型トランザクションが既にアクティブな場合、BEGIN TRANSACTION をもう一度実行するとTRANSACTION_NOT_SUPPORTED.NESTED_TRANSACTIONエラーが発生します。 対話型トランザクションでは、入れ子はサポートされていません。
  • BEGIN TRANSACTIONBEGIN 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;

これにより、同時変更に関係なく、トランザクション全体で一貫した読み取りが保証されます。