ACID
事务具有四大特性,分别是原子性、一致性、隔离性和持久性,简称事务的ACID特性;
一、原子性(atomicity)
一个事务要么全部提交成功,要么全部不完成,不会结束在中间某个环节。如果事务在执行过程中发生错误,会被回滚到事务开始前的状态。
二、一致性(consistency)
事务的执行不能破坏数据库数据的完整性和一致性,一个事务在执行之前和执行之后,数据库都必须处于一致性状态。既从一个正确的状态,迁移到另一个正确的状态。
例子:
以银行之间的转账为例进行讲解,假设有3个账户A、B、C,每个账户的余额是100元,则3个账户一共有300元。无论A、B、C之间怎样转账,无论并发多少次,A、B、C三人的账户总额也应该是300元。
三、隔离性(isolation)
事务的隔离性是指在并发环境中,并发的事务时相互隔离的,一个事务的执行不能不被其他事务干扰。不同的事务并发操作相同的数据时,每个事务都有各自完成的数据空间,即一个事务内部的操作及使用的数据对其他并发事务时隔离的,并发执行的各个事务之间不能相互干扰。
数据库隔离级别
- uncommitted 读未提交,可能产生脏读
- committed 读提交,可能产生幻读
- repeatable 重复读,读取数据时将表锁起来,不在允许修改操作。可能产生幻读
- serializable 串行化,避免脏读、幻读、不可重复读。但是效率低下,比较消耗数据库性能。
隔离级别 | 脏读 | 不可重复读 | 幻读可能性 |
---|---|---|---|
READ UNCOMMITTED | 是 | 是 | 是 |
READ COMMITTED | 否 | 是 | 是 |
REPEATABLE READ | 否 | 否 | 是 |
SERIALIZABLE | 否 | 否 | 否 |
四、持久性(durability)
一旦事务提交,那么它对数据库中的对应数据的状态的变更就会永久保存到数据库中。
即使发生系统崩溃或机器宕机等故障,只要数据库能够重新启动,那么一定能够将其恢复到事务成功结束的状态
脏读、幻读、不可重复读
1.脏读:一个事务对一个数据进行了修改,但是并未提交事务,而另一事务访问了该条数据,并使用该条数据就会导致脏读
2.不可重复读:是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。(修改)
3.幻读:是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。(新增或者删除)