ACID,指的是在数据库事务正确执行的四个基本要素的缩写。
具体解释:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
任何一个数据库事物都 必须满足 ACID,只有这样才能保证在事务执行过程中的正确性
接下来我们逐条解释:
原子性(Atomicity)
原子性其实非常好理解,我认为它指的就是一种完整性,就是说任何一个具备原子性的事务只有两种状态:完成操作 和 未操作。原子性保证事务的一切操作要么一起成功要么一起失败。原子性的事务一旦开始就一直运行到结束,它不会被线程调度机制中断。如果遇到强制性中断,就会全部回滚到最初未操作的状态。还有一种说法是“原子操作(atomic operation)是不需要synchronized”
一致性(Consistency)
这个是数据库事物的核心,它是数据库最基本的特性。这条特性看起来简单,但是理解起来还是比较复杂的。
它的书面定义是:数据库一致性(Database Consistency)是指事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。
它分为两个方面:一致读 和 一致写
一致读:事务读取数据只能从一个状态中读取,不能从2个或者2个以上状态读取。
一致写:事务执行的数据变更只能基于上一个一致的状态,且只能体现在一个状态中。
具体解释请认真参看并理解 知乎 如何理解数据库事务中的一致性的概念?徐志斌的回答
隔离性(Isolation)
数据并发读写中存在三大致命的问题:
① 脏读问题:
例:A 向 B 传送数据,A 传送操作还未完成提交 B 就接受并更新了自己的数据,如果此时 A 遇到问题回滚了,那么 B 的数据就变成了脏数据(垃圾数据)
② 不可重复读问题:
在一个事务中,对于同一份数据的读取结果总是相同的,无论是否有其他事务对这份数据进行操作,以及这个事务是否提交
例:A 事务是读取两次数据,B 事务是修改数据,两个事务操作同一数据,恰好 B 事务发生在 A 事务两次读取之间,导致 A 两次读取结果不一致。这其实看似合情合理,其实是不被允许的,因为某些情况下一个事务对同一数据做同一操作的结果不一致会导致 bug
③ 幻读问题:
在同一个事务中,同一个查询多次返回的结果不一致。(注意与不可重复读问题的区别)
例:A 事务统计银行总存款数,B 事务是某一用户存款,如果 A 事务连续查两次结果不一致就是幻读。试想一下,银行如果存在幻读问题那可就有大麻烦了
隔离性按照级别分为四级(从上至下,隔离度越高):
① READ_UNCOMMITTED(读未提交):
这个级别最低,安全系数最低,会导致一切并发性问题
② READ_COMMITTED (读已提交):
在这个安全系数下就解决了脏读问题
③ REPEATABLE_READ(可重复读):
在一个事务中,对于同一份数据的读取结果总是相同的,无论是否有其他事务对这份数据进行操作,以及这个事务是否提交。它解决了脏读 与 不可重复读问题
④ SERIALIZABLE(序列化):
这个就比较简单粗暴了,直接为了安全取消并发,一次只能执行一个事务
持久性(Durability)
就是说任何执行成功的事务修改后的数据都要保证永久的保存在数据库系统中,能够时刻记录系统的状态,并且保证发生故障后能够恢复