适用于:
Databricks SQL
Databricks Runtime 18.0 及更高版本
实现一个 SQL 脚本块,该块可以包含一系列 SQL 语句、流控制语句、局部变量声明和异常处理程序。 标记为“ATOMIC”时,块作为一个事务单元运行,其中所有语句要么一起成功,要么一起失败。
Syntax
BEGIN ATOMIC
statement1;
statement2;
...
END;
参数
没有。 关键字 ATOMIC 修改 复合语句 行为。
说明
将复合语句标记为原子事务块。 块中的所有语句都以单个事务单元的形式运行-要么所有语句一起成功,要么回滚所有更改(如果任何语句失败)。 Azure Databricks 会在块成功完成时自动提交更改,或者回滚所有更改(如果任何语句失败)。
BEGIN ATOMIC ... END 块可以嵌套在其他原子块中。 内部块被整合到外部事务中,所有语句都作为一个更大且单一的事务的一部分来运行。 这不是嵌套事务。 原子块不能包含非原子 BEGIN ... END 块。
这是一个非交互式事务,您不需要手动运行COMMIT或ROLLBACK。
要求
- 多语句、多表交易中被写入的所有表必须:
- 是 Unity 目录托管表 (Delta 或 Iceberg)
- 已启用目录管理的提交
- 使用 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;