ACID
ACID 是数据库管理系统中保证事务正确执行的四大特性的缩写。
1. Atomicity(原子性):
- 原子性指事务是不可分割的单位,要么全部执行成功,要么全部失败回滚。—
All or nothing.
- 通常使用日志记录机制来启动回滚功能。
- 在事务执行过程中,如果发生错误,系统会撤销事务已经执行的操作,使数据回滚到事务开始前的状态,保证数据的一致性。
2. Consistency(一致性):
- 一致性指事务将系统从一个一致性状态转换到另一个一致性状态。
-
在事务开始前和事务结束后,数据库的完整性约束没有被破坏,数据的约束依然有效。
-
事务执行的过程中,数据库始终保持一致性状态。
- 例如,账户余额不可以是负数,一致性可以防止无效数据弄乱数据库。
3. Isolation(隔离性):
- 隔离性指数据库允许多个并发事务同时对其数据进行读写,并且事务之间是相互隔离的,一个事务的执行不应影响其他事务的执行。
数据库系统中的隔离级别是指多个事务并发执行时,一个事务对数据的读写操作受到其他事务影响程度的程度。
隔离级别越高,事务之间的相互影响越小,但也可能会导致系统性能下降。
1. 读未提交(Read Uncommitted)
- 定义:最低的隔离级别。一个事务可以读取另一个事务未提交的数据修改。
- 问题:可能会导致脏读(
Dirty Read
),即一个事务读取到了另一个未提交事务的数据,但该事务最终可能会回滚,导致读取到的数据是无效的。
2. 读已提交(Read Committed)
- 定义:一个事务只能读取到另一个事务已经提交的数据。
- 解决的问题:避免了脏读,但仍可能导致不可重复读和幻读问题。
- 不可重复读示例:一个事务内的两次读取操作返回的结果不一致,通常是由于其他事务修改了数据造成的
同一个事务中多次读取同样的数据时,其值保持发生了改变。即两次读取期间,其他事务对数据进行了修改,该事务在同一事务内的多次读取结果不一致。
- 幻读示例:
一个事务内两次查询返回的记录数不一致,通常是由于其他事务插入了新数据或删除了数据造成的。
3. 可重复读(Repeatable Read)
- 定义:确保在同一个事务中多次读取同样的数据时,其值保持不变。即使其他事务对数据进行了修改,该事务在同一事务内的多次读取结果也不会改变。
- 解决的问题:避免了不可重复读,但仍可能出现幻读问题。
4. 序列化(Serializable)
- 定义:最高的隔离级别,通过强制事务串行执行来避免并发问题。保证了所有并发事务的执行效果与串行执行的效果相同,从而避免了脏读、不可重复读和幻读的问题。
- 解决的问题:提供最高的数据一致性和完整性,但可能会导致性能下降,因为事务必须严格按照顺序执行。
选择隔离级别的考虑因素:
-
数据一致性要求:如果应用对数据一致性要求极高,应选择较高的隔离级别,如可重复读或串行化。
-
并发性能需求:如果并发性能是关键,可以选择较低的隔离级别,如读已提交或读未提交,但需要考虑并发带来的数据一致性问题。
4. Durability(持久性):
- 持久性指一旦事务提交,其所做的修改会永久保存在数据库中,并不会因系统故障导致数据的丢失。
- 通常通过将事务的操作持久化到非易失性存储介质(如硬盘)来实现,保证即使系统崩溃,事务提交的数据也不会丢失。
- 分布式节点持久化:
一言以蔽之:原子性——回滚失败事务,一致性——遵循规则,隔离性——防止干扰,持久性——数据永久保存。