ACID 事务是关系型数据库一个重要的特性,也是 NewSQL 数据库最大的挑战之一。 PolarDB-X是一款基于云架构理念,并同时支持在线事务处理与在线分析处理 (Hybrid Transactional and Analytical Processing, HTAP)的融合型分布式数据库产品。因此,对PolarDB-X来说,支持分布式ACID事务是必须的。
事务ACID概念
数据库英文为DataBase,是由Data + Base两个单词组成,可以理解为存放数据的仓库,最早数据库的诞生也是为解决数据的记账问题,要充分理解ACID的概念,可以从最朴素的转账业务看下。
转账案例:
A账户余额有100元,B账户余额0元,在这个基础上A向B转账40元,流程如下:
查询A账户余额,看金额是>=40元。
满足条件则先从A账户扣款40元(当前A余额=60、当前B余额=0)
然后再向B账户增加40元(当前A余额=60、当前B余额=40)
在这个案例中,我们分别看一下ACID在其中扮演的一些要求:
持久性 (Durability)。 持久性是指一旦事务成功提交后,只要修改的数据都会进行持久化,不会因为异常、宕机而造成账户余额和转账信息的丢失。通常处于性能考虑数据库会进行内存写入的优化,避免数据的每次操作都进行写盘操作,数据库通常会借助于WAL日志(比如redo log)来持久性的要求。
原子性(Atomicity)。一个事务必须是一系列操作的最小单元,这系列操作的过程中,要么整个执行,要么整个回滚,不存在只执行了其中某一个或者某几个步骤。 对应到案例中,原子性就代表(检查余额、转账、到账)三个步骤就是一个整体,少了任何一个都不能称为一次转账。尤其在分布式事务模型下,多个分片一般会通过2PC策略保持一个状态协同。
一致性(Consistency)。事务的一致性要保证数据库整体数据的完整性和业务的数据的一致性,初看和原子性有一些相似的语义。对应到案例中,一致性会要求业务查询A/B账号时要么看到100/0 或 60/40的余额状态。
隔离性(Isolation)。事务的隔离性是指并发事务操作时,事务之间不会互相影响,初看是和前三个定义不对齐,其定义更多的是从技术实现角度考虑,一直没有统一的标准,不同数据库厂商从自己的实现角度会有不一样的行为。