本文为您介绍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 INTO作业(先结束) |
|
|
|
|
UPDATE/DELETE作业(先结束) |
|
|
|
|
MERGE小文件作业(先结束) |
|
|
|
|
综上所述,冲突报错规则概括如下:
- INSERT类操作不会因为数据变化而产生冲突报错。
- UPDATE、DELETE、MERGE小文件操作会因为目标非分区表或分区数据变化而产生冲突报错。
说明 需要注意的是,在极端情况下,如果多个作业并发且元数据正处于更新阶段,可能因元数据更新而产生冲突报错。