ATOMIC 复合语句

适用于:勾选“是” Databricks SQL 勾选“是” Databricks Runtime 18.0 及更高版本

实现一个 SQL 脚本块,该块可以包含一系列 SQL 语句、流控制语句、局部变量声明和异常处理程序。 标记为“ATOMIC”时,块作为一个事务单元运行,其中所有语句要么一起成功,要么一起失败。

Syntax

BEGIN ATOMIC
  statement1;
  statement2;
  ...
END;

参数

没有。 关键字 ATOMIC 修改 复合语句 行为。

说明

将复合语句标记为原子事务块。 块内的所有语句作为一个事务单元执行:要么所有语句都成功执行,要么只要有任何语句失败,所有更改都会被回滚。 在代码块成功执行时,Azure Databricks会自动提交更改;如果任何语句失败,则会回滚所有更改。

BEGIN ATOMIC ... END 块可以嵌套在其他原子块中。 内部块被扁平化到外部事务中。 所有语句都作为单个更大事务的一部分执行。 这不是嵌套事务。 原子块不能包含非原子 BEGIN ... END 块。

这是一个非交互式事务。 无需手动运行COMMITROLLBACK

要求

  • 在多语句、多表事务中写入的所有表必须:
    • 必须是 Unity Catalog 托管表(Delta 或 Iceberg)
    • 已启用 Catalog 提交
  • 使用 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;

其他资源