ACID,指数据库事务正确执行的四个基本要素的缩写。
包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。一个支持事务(Transaction)的数据库,必须要具有这四种特性,否则在事务过程(Transaction processing)当中无法保证数据的正确性,交易过程极可能达不到交易方的要求。
1,Atomicity原子性:一个事务中所有操作都必须全部完成,要么全部不完成。
2,Consistency一致性. 在事务开始或结束时,数据库应该在一致状态。
3,Isolation隔离层. 事务将假定只有它自己在操作数据库,彼此不知晓。
4,Durability. 一旦事务完成,就不能返回。
ACID模型要求一个事物必须满足上面的四点,这是对关系型传统数据库的指导性依据。而非关系型数据库NoSql则不再依赖这一模型。
ACD是一个事务的基本要求,如果不考虑Isolation隔离层,则会出现几个问题:
1,脏读:
脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据。
2,不可重复读:
不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。
3,幻读:
幻读是事务非独立执行时发生的一种现象。例如事务T1对一个表中所有的行的某个数据项做了从“1”修改 为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。
脏读是读取到了其他事务未提交的数据,必须要避免;
不可重复读和幻读是读取到了另外一个事务已经提交的数据,和脏读不同。
由此产生了四种事务隔离级别:
Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
RR:Repeatable read (可重复读):可避免脏读、不可重复读的发生。
RC:Read committed (读已提交):可避免脏读的发生。
RU:Read uncommitted (读未提交):最低级别,任何情况都无法保证。
Serializable隔离级别最高,执行效率最低,由此下推。因RU无法保证隔离没有存在价值,Serializable过高的隔离级别严重拉低执行效率,因此绝大多数事务都将工作在RR和RC两种隔离界别下。
Mysql数据库支持上述四种隔离级别,默认级别为RR,很多生产环境建议降为RC,避免由此引发的间隙锁。
Oracle数据库支持Serializable和RC,默认级别为RC。