跳到主要内容
版本: 最新版本-3.5

SQL 事务

启动一个简单的 SQL 事务,以批量提交多个 INSERT 语句。

概述

自 v3.5.0 起,StarRocks 支持 SQL 事务,以确保将数据加载到多个表中时更新表的原子性。

一个事务由在同一原子单元中处理的多个 SQL 语句组成。 事务中的语句要么一起应用,要么一起撤消,从而保证事务的 ACID(原子性、一致性、隔离性和持久性)属性。

目前,StarRocks 中的 SQL 事务仅支持通过 INSERT 进行加载操作,并且不允许对同一表执行多个 INSERT 语句。 事务的 ACID 属性仅在有限的 READ COMMITTED 隔离级别上得到保证,即

  • 一个语句仅对在该语句开始之前提交的数据进行操作。
  • 如果在第一个语句和第二个语句的执行之间提交了另一个事务,则同一事务中的两个连续语句可能会对不同的数据进行操作。
  • 先前 DML 语句带来的数据更改对于同一事务中的后续语句是不可见的。

事务与单个会话相关联。 多个会话不能共享同一个事务。

用法

  1. 事务必须通过执行 START TRANSACTION 语句来启动。 StarRocks 还支持同义词 BEGIN。

    { START TRANSACTION | BEGIN [ WORK ] }
  2. 启动事务后,可以在事务中定义多个 INSERT 语句。 有关详细信息,请参阅使用说明

  3. 事务必须通过执行 COMMITROLLBACK 显式结束。

    • 要应用(提交)事务,请使用以下语法

      COMMIT [ WORK ]
    • 要撤消(回滚)事务,请使用以下语法

      ROLLBACK [ WORK ]

示例

BEGIN WORK;
-- Insert data from a native table to another.
INSERT INTO insert_wiki_edit_backup
SELECT * FROM insert_wiki_edit;
-- Insert data with specified values.
INSERT INTO source_wiki_edit
VALUES
("2015-09-12 00:00:00","#en.wikipedia","AustinFF",0,0,0,0,0,21,5,0),
("2015-09-12 00:00:00","#ca.wikipedia","helloSR",0,1,0,1,0,3,23,0);
-- Insert data from remote storage.
INSERT INTO insert_wiki_edit
SELECT * FROM FILES(
"path" = "s3://inserttest/parquet/insert_wiki_edit_append.parquet",
"format" = "parquet",
"aws.s3.access_key" = "XXXXXXXXXX",
"aws.s3.secret_key" = "YYYYYYYYYY",
"aws.s3.region" = "us-west-2"
);
COMMIT WORK;

使用说明

  • 目前,StarRocks 仅支持 SQL 事务中的 INSERT 和 SELECT 语句。
  • 事务中 DML 语句的所有目标表必须位于同一数据库中。
  • 不允许在事务中对同一表执行多个 INSERT 语句。 否则,系统会返回错误。
  • 先前 INSERT 语句的目标表不能是后续语句的源表。 否则,系统会返回错误。
  • 不允许嵌套事务。 不能在 BEGIN-COMMIT/ROLLBACK 对中指定 BEGIN WORK。
  • 如果正在进行的事务所属的会话终止或关闭,则该事务将自动回滚。
  • StarRock 仅支持上述事务隔离级别的有限 READ COMMITTED。
  • 不支持写入冲突检查。 当两个事务同时写入同一表时,两个事务都可以成功提交。 数据更改的可见性(顺序)取决于 COMMIT WORK 语句的执行顺序。