聊聊数据(一):ACID

ACID 是在数据库在插入或更新数据过程中,为了保证事务,所要遵守的原则。ACID 的四个字母分别代表着:

  • A(Atomicity 原子性
  • C(Consistency 一致性
  • I(Isolation 隔离性
  • D(Durability 持久性

原子性

一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

一致性

在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。

隔离性

数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。

事务隔离分为不同级别,包括:

  • 未授权读(Read Uncommitted):在 Read Uncommitted 级别,事务中的修改,即使没有提交,对其它事务也都是可见的。事务可以读取未提交的数据,这也被称为脏读(Dirty Read)
  • 授权读(Read Committed):Read Committed 满足一个事务从开始直到提交之前,所做的任何修改对其它事务都是不可见的。Read Committed 也叫做不可重复读(Nonrepeatable Read),因为两次执行同样的查询,可能得到不同的结果。
  • 可重复读(Repeatable Read):Repeatable Read 保证了在同一个事务中多次读取同样记录的结果是一致的。但是,还是无法解决幻读(Phantom Read)的问题,即当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入新的记录,当之前的事务再次读取该范围的记录时,会产生幻行(Phantom Row)。
  • 串行化(Serializable):Serializable 通过强制任务串行执行,避免了前面说的幻读的问题。简单来说,Serializable 会在读取的每一个数据上都加锁,所以可能导致大量的超时和锁竞争的问题。

ANSI SQL 隔离级别:

隔离级别 脏读可能性 不可重复读可能性 幻读可能性 加锁读
Read Uncommitted YES YES YES NO
Read Committed NO YES YES NO
Repeatable Read NO NO YES NO
Serializable NO NO NO YES

持久性

事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

参考