数据库的ACID特性详解
我们在大学中学到的数据库基本理论中,是指由一系列连续的数据库操作组成的一个完整的逻辑过程。事务(Transaction)是并发控制的基本单位。所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。
1、数据库事务在 数据库管理系统(DBMS)中,必须具备ACID特性,ACID是Atomic(原子性)、Consistency(一致性)、Isolation(隔离性)和Durability(持久性)的英文缩写。
1)原子性(Atomicity)
事务的原子性指的是,一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
2)一致性(Consistency)
事务的一致性指的是,在一个事务执行之前和执行之后数据库都必须处于一致性状态。如果事务成功地完成,那么系统中所有变化将正确地应用,系统处于有效状态。如果在事务中出现错误,那么系统中的所有变化将自动地回滚,系统返回到原始状态。
3)隔离性(Isolation)
事务的隔离性指的是,在并发环境中,隔离性是指两个事务之间互不干扰。由并发事务所做的修改必须与任何其他并发事务所做的修改隔离。事务查看数据更新时,数据所处的状态要么是另一事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看到中间状态的数据。
4)持久性(Durability)
事务的持久性指的是,只要事务成功结束,它对数据库所做的更新就必须永久保存下来。即使发生系统崩溃,重新启动数据库系统后,数据库还能恢复到事务成功结束时的状态。
事务的四个隔离级别:
1)未提交读(Read Uncommitted):
SELECT语句以非锁定方式被执行,所以有可能读到脏数据,隔离级别最低。(读不锁)
2)提交读(Read Committed):
只能读取到已经提交的数据。即解决了脏读,但未解决不可重复读。(读锁,等写完)
3)可重复读(Repeated Read):
在同一个事务内的查询都是事务开始时刻一致的,InnoDB的默认级别。在SQL标准中,该隔离级别消除了不可重复读,但是还存在幻读。(写锁,等读完)
4)串行读(Serializable):
完全的串行化读,所有SELECT语句都被隐式的转换成SELECT … LOCK IN SHARE MODE,即读取使用表级共享锁,读写相互都会阻塞。隔离级别最高。
事务并发问题
1)脏读(Dirty Reads):
事务A读取了事务B的更新的数据,但是事务B回滚了,导致A读取的为脏数据。
2)不可重复读(Non-Repeatable Reads):
事务A读取同一数据两次,但是在两次之间事务B对该数据进行了修改并提交,导致事务A读取两次读取不一致。
3)幻读(Phantom Reads):
事务A修改全表的数据,在未提交时,事务B向表中插入或删除数据,导致事务A读取的数据与需要修改的数据不一致。
PS: 不可重复读针对的时数据的修改,幻读针对的时数据的新增和删除。解决不可重复读问题只需要给对应记录上行锁,而解决幻读需要对表加锁。
隔离级别导致事务并发问题
实现事物隔离性主要有两种方式
隔离的实现主要有读写锁和MVCC(Multi-Version Concurrency Control)多版本并发处理方式。