事务的 ACID 特性 是数据库系统中确保事务处理可靠性的四个基本要求。每个字母代表一个特性,这些特性确保了数据库在处理事务时能够保持一致性、完整性和可靠性,避免数据丢失和不一致。
ACID 是以下四个英文单词的首字母缩写:
-
A — 原子性(Atomicity)
-
C — 一致性(Consistency)
-
I — 隔离性(Isolation)
-
D — 持久性(Durability)
下面是对每个特性的详细解释:
1. 原子性(Atomicity)
-
定义:原子性意味着一个事务中的所有操作要么完全成功,要么完全失败。如果事务中的任何操作失败,数据库将回滚到事务开始之前的状态,确保不会有部分操作被提交,避免数据不一致。
-
特性表现:事务是不可分割的单位,即“要么全做,要么全不做”。如果事务中的某一部分操作失败,所有操作都会撤销。
-
例子:
-
例如,银行转账事务,假设从账户A扣除100元并将其转账到账户B。事务执行时,如果从账户A成功扣款,但向账户B存款操作失败,原子性保证整个事务回滚,即从账户A扣款的操作也会被撤销,资金不会丢失。
-
2. 一致性(Consistency)
-
定义:一致性确保事务执行前后的数据库状态必须是合法的,符合所有定义的约束和规则。例如,外键约束、唯一性约束、检查约束等。在事务执行前,数据库处于一致性状态,事务完成后,数据库也应处于一致性状态。
-
特性表现:事务执行之前,数据库处于一个一致的状态,事务执行后,数据库仍然保持一致,符合所有业务规则和约束条件。
-
例子:
-
假设一个订单管理系统中,订单的总金额应该等于商品单价乘以数量。如果事务涉及订单的更新操作(如增加商品数量或修改商品价格),一致性保证总金额更新后仍然符合系统的业务规则。
-
3. 隔离性(Isolation)
-
定义:隔离性指的是并发执行的事务之间应该互不干扰,一个事务的执行不应影响其他事务的执行。不同的事务之间可以并发操作,但它们的执行不应相互影响,从而保证每个事务的完整性。
-
特性表现:隔离性定义了事务之间的相互影响程度。数据库提供不同的隔离级别,以控制事务之间的并发行为(如脏读、不可重复读、幻读等)。
-
脏读:事务A读取了事务B未提交的数据。
-
不可重复读:事务A多次读取某数据,而事务B在此期间修改了该数据,导致事务A读取到不同的结果。
-
幻读:事务A读取某些记录,事务B插入或删除了记录,导致事务A重新查询时看到不同的数据。
-
-
隔离级别(不同隔离级别带来的影响):
-
读未提交(Read Uncommitted):最低隔离级别,允许脏读。
-
读已提交(Read Committed):禁止脏读,但可能发生不可重复读。
-
可重复读(Repeatable Read):禁止脏读和不可重复读,但可能发生幻读。
-
串行化(Serializable):最高隔离级别,事务完全串行执行,避免脏读、不可重复读和幻读,但性能较差。
-
-
例子:
-
假设两个用户同时在同一账户进行转账操作,一个用户正在查询账户余额,另一个用户正在修改账户余额。隔离性保证一个事务不会在另一个事务执行前看到不一致的中间状态。
-
4. 持久性(Durability)
-
定义:持久性确保一旦事务提交成功,其对数据库的修改是永久的,不会因系统崩溃、断电或其他故障而丢失。这意味着事务一旦提交,数据就会被永久保存在数据库中。
-
特性表现:持久性保证了事务完成后,数据的持久性,不会因为系统崩溃或其他异常导致数据丢失,数据库中的变更会被永久保存,即使发生故障,数据也不会丢失。
-
例子:
-
假设一个银行转账操作已提交成功,从账户A转出100元并存入账户B。即使数据库崩溃,经过恢复后,100元的转账记录应该依然存在,而不是丢失。
-
总结:ACID 特性
-
原子性:事务是不可分割的,要么全部执行,要么全部回滚。
-
一致性:事务的执行不会破坏数据库的完整性和一致性,事务结束时数据库应符合所有规则。
-
隔离性:并发事务的执行互不干扰,事务操作之间的执行结果是隔离的。
-
持久性:事务一旦提交,所有变更都将永久保存,不受系统崩溃等问题影响。
这些特性确保了在多用户环境中,数据库能够处理并发事务时保持数据的一致性、完整性和可靠性。因此,ACID 特性是数据库系统中的一个核心概念,也是现代关系型数据库管理系统(RDBMS)设计和实施的基础。