本文为您介绍MaxCompute在作业并发情况下ACID的语义及Transactional表的ACID语义。

相关术语

  • 操作:指在MaxCompute上提交的单个作业。
  • 数据对象:指持有实际数据的对象,例如非分区表、分区。
  • INTO类作业:指INSERT INTO、DYNAMIC INSERT INTO等包含关键字INTO的SQL作业。
  • OVERWRITE类作业:指INSERT OVERWRITE、DYNAMIC INSERT OVERWRITE等包含关键字OVERWRITE的SQL作业。
  • Tunnel数据上传:可以归结为INTO类或OVERWRITE类作业。

ACID语义描述

  • 原子性(Atomicity):一个操作或是全部完成,或是全部不完成,不会结束在中间某个环节。
  • 一致性(Consistency):从操作开始至结束的期间,数据对象的完整性没有被破坏。
  • 隔离性(Isolation):操作独立于其他并发操作完成。
  • 持久性(Durability):操作处理结束后,对数据的修改将永久有效,即使出现系统故障,该修改也不会丢失。

MaxCompute并发写操作的ACID特性

  • 原子性(Atomicity)
    • 任何时候MaxCompute会保证在冲突时只有一个作业执行成功,其他冲突作业执行失败。
    • 对于单个表或分区的CREATE、OVERWRITE、DROP操作,可以保证其原子性。
    • 跨表操作时不支持原子性(例如MULTI-INSERT)。
    • 在极端情况下,以下操作可能不保证原子性:
      • DYNAMIC INSERT OVERWRITE多于一万个分区,不支持原子性。
      • INTO类操作:这类操作失败的原因是事务回滚时数据清理失败,但不会造成原始数据丢失。
  • 一致性(Consistency)
    • OVERWRITE类作业可保证一致性。
    • INTO类作业在冲突失败后可能存在失败作业的数据残留。
  • 隔离性(Isolation)
    • 非INTO类操作保证读已提交。
    • INTO类操作存在读未提交的场景。
  • 持久性(Durability)
    • MaxCompute保证数据的持久性。

Transactional表的ACID特性

Transactional表的ACID特性在MaxCompute并发写操作的ACID特性基础上,支持如下新特性:
  • INTO类操作保证读已提交,作业冲突执行失败后无数据残留。
  • 对于单个非分区表或单个分区的UPDATE、DELETE、MERGE小文件操作,可以保证其原子性。

    例如,当两个UPDATE操作并发修改同一分区时,只会有一个UPDATE操作执行成功。不会存在一个UPDATE操作部分执行成功,也不会存在两个UPDATE操作分别执行成功的情况。

操作并发冲突说明

当作业并发运行且写入相同目标表时,可能出现冲突。产生冲突时,先结束的作业会执行成功,后结束的作业可能会因冲突而报错。

下表为作业并发提交场景下,对同一个非分区表或分区的并发操作先后结束的冲突说明。

作业类型 INSERT OVERWRITE/TRUNCATE作业(后结束) INSERT INTO作业(后结束) UPDATE/DELETE作业(后结束) MERGE小文件作业(后结束)
INSERT OVERWRITE/TRUNCATE作业(先结束)
  • 先、后结束的作业都会执行成功。
  • INSERT OVERWRITE/TRUNCATE作业会覆盖先结束的INSERT OVERWRITE/TRUNCATE作业的数据。
  • 先、后结束的作业都会执行成功。
  • INSERT INTO作业会在先结束的INSERT OVERWRITE/TRUNCATE作业的数据上追加数据。
  • 后结束的UPDATE/DELETE作业会报错。
  • 后结束的UPDATE/DELETE作业对应的非分区表或分区被先结束的INSERT OVERWRITE/TRUNCATE作业修改。
  • 后结束的MERGE小文件作业会报错。
  • 后结束的MERGE小文件作业对应的非分区表或分区被先结束的INSERT OVERWRITE/TRUNCATE作业修改。
INSERT INTO作业(先结束)
  • 先、后结束的作业都会执行成功。
  • 后结束的INSERT OVERWRITE/TRUNCATE作业会覆盖先结束的INSERT INTO作业的数据。
  • 先、后结束的作业都会执行成功。
  • 后结束的INSERT INTO作业会在先结束的INSERT INTO作业的数据上追加数据。
  • 后结束的UPDATE/DELETE作业会报错。
  • 后结束的UPDATE/DELETE作业对应的非分区表或分区被先结束的INSERT INTO作业修改。
  • 后结束的MERGE小文件作业会报错。
  • 后结束的MERGE小文件作业对应的非分区表或分区被先结束的INSERT INTO作业修改。
UPDATE/DELETE作业(先结束)
  • 先、后结束的作业都会执行成功。
  • 后结束的INSERT OVERWRITE/TRUNCATE作业会覆盖先结束的UPDATE/DELETE作业的数据。
  • 先、后结束的作业都会执行成功。
  • 后结束的INSERT INTO作业会在先结束的UPDATE/DELETE作业的数据上追加数据。
  • 后结束的UPDATE/DELETE作业会报错。
  • 后结束的UPDATE/DELETE作业对应的非分区表或分区被先结束的UPDATE/DELETE作业修改。
  • 后结束的MERGE小文件作业会报错。
  • 后结束的MERGE小文件作业对应的非分区表或分区被先结束的INSERT INTO作业修改。
MERGE小文件作业(先结束)
  • 先、后结束的作业都会执行成功。
  • 后结束的INSERT OVERWRITE/TRUNCATE作业会覆盖先结束的MERGE小文件作业的数据。
  • 先、后结束的作业都会执行成功。
  • 后结束的INSERT INTO作业会在先结束的MERGE小文件作业的数据上追加数据。
  • 后结束的UPDATE/DELETE作业会报错。
  • 后结束的UPDATE/DELETE作业对应的非分区表或分区被先结束的MERGE小文件作业修改。
  • 后结束的MERGE小文件作业会报错。
  • 后结束的MERGE小文件作业对应的非分区表或分区被先结束的MERGE小文件作业修改。
综上所述,冲突报错规则概括如下:
  • INSERT类操作不会因为数据变化而产生冲突报错。
  • UPDATE、DELETE、MERGE小文件操作会因为目标非分区表或分区数据变化而产生冲突报错。
说明 需要注意的是,在极端情况下,如果多个作业并发且元数据正处于更新阶段,可能因元数据更新而产生冲突报错。