適用於:
Databricks SQL
Databricks 執行環境 18.0 及以上版本
實作 SQL 腳本區塊,其中包含一連串的 SQL 語句、流程控制語句、局部變數宣告和例外狀況處理程式。 當標記為 ATOMIC時,該區塊作為交易單元運行,所有語句會同時成功或失敗。
語法
BEGIN ATOMIC
statement1;
statement2;
...
END;
參數
沒有。 關鍵字 ATOMIC 會修改 複合語句 的行為。
說明
將複合陳述標記為原子交易區塊。 區塊內的所有語句作為單一交易單元執行——要麼所有語句同時成功,要麼如果有語句失敗,所有變更都會被回滾。 Azure Databricks 會在區塊成功完成時自動提交變更,或在任何語句失敗時回滾所有變更。
BEGIN ATOMIC ... END 區塊可以嵌套在其他原子區塊中。 內層區塊被壓平成外層交易——所有語句都作為單一較大交易的一部分執行。 這不是巢狀交易。 原子區塊不能包含非原子 BEGIN ... END 區塊。
這是非互動式交易——你不需要執行 COMMIT 或 ROLLBACK 手動操作。
要求
- 所有在多語句、多表交易中涉及寫入的資料表必須:
- Be Unity Catalog 管理的資料表(Delta 或 Iceberg)
- 啟用目錄管理的提交
- 可以使用 SQL 倉庫、 無伺服器運算,或是運行 Databricks Runtime 18.0 及以上版本的叢集。
- 你必須對交易中修改的物件擁有適當的權限。 每當執行每個語句時,系統會檢查權限。
Examples
以下範例展示了常見的交易模式。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;