次の方法で共有


ATOMIC 複合ステートメント

適用対象:チェック済みです Databricks SQL チェック済みです Databricks Runtime 18.0 以降

SQL ステートメント、フロー制御ステートメント、ローカル変数宣言、および例外ハンドラーのシーケンスを含めることができる SQL スクリプト ブロックを実装します。 ATOMICとしてマークされている場合、ブロックはトランザクション 単位として実行され、すべてのステートメントが一緒に成功するか、一緒に失敗します。

構文

BEGIN ATOMIC
  statement1;
  statement2;
  ...
END;

パラメーター

なし。 ATOMIC キーワードは、複合ステートメントの動作を変更します。

説明

複合ステートメントをアトミック トランザクション ブロックとしてマークします。 ブロック内のすべてのステートメントは、単一のトランザクション 単位として実行されます。すべてのステートメントが一緒に成功するか、ステートメントが失敗した場合にすべての変更がロールバックされます。 Azure Databricks は、ブロックが正常に完了したときに変更を自動的にコミットするか、ステートメントが失敗した場合にすべての変更をロールバックします。

BEGIN ATOMIC ... END ブロックは、他のアトミック ブロック内に入れ子にすることが可能です。 内部ブロックは外側のトランザクションにフラット化されます。すべてのステートメントは、1 つの大きなトランザクションの一部として実行されます。 これは入れ子になったトランザクションではありません。 アトミック ブロックに非アトミック BEGIN ... END ブロックを含めることはできません。

これは非対話型トランザクションです。 COMMIT を実行したり、手動で ROLLBACK したりする必要はありません。

必要条件

  • 複数ステートメントで書き込まれるすべてのテーブルでは、複数テーブル トランザクションで次の処理を行う必要があります。
  • SQL ウェアハウス、 サーバーレス コンピューティング、または Databricks Runtime 18.0 以降を実行しているクラスターを使用します。
  • トランザクション内で変更されたオブジェクトに対する適切なアクセス許可が必要です。 権限は、各ステートメントの実行時にチェックされます。

例示

次の例では、 BEGIN ATOMIC ... END;を使用する一般的なトランザクション パターンを示します。

複数のテーブル間で更新を調整する

BEGIN ATOMIC
  UPDATE accounts SET balance = balance - 100 WHERE id = 1;
  UPDATE accounts SET balance = balance + 100 WHERE id = 2;
  INSERT INTO audit_log VALUES (1, 2, 100, current_timestamp());
END;

コミットする前にデータを検証する

BEGIN ATOMIC
  INSERT INTO staging_customers
  SELECT * FROM external_source WHERE ingest_date = current_date();

  IF (SELECT COUNT(*) FROM staging_customers WHERE email NOT LIKE '%@%') > 0 THEN
    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Invalid email addresses found';
  END IF;

  MERGE INTO customers AS target
  USING staging_customers AS source
  ON target.customer_id = source.customer_id
  WHEN MATCHED THEN UPDATE SET *
  WHEN NOT MATCHED THEN INSERT *;
END;