1.3.事务
事务,有ACID的概念:
- atomic 原子性
- consistency 一致性
- isolation 隔离性
- durability 持久性
- 原子性
一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性。
- 一致性
数据库总是从一个一致性的状态转换到另一个一致性的状态。因为事务最终没有提交,所以事务中所作的修改也不会保存到数据库中。
- 隔离性
通常来说,一个事务所作的修改在最终提交之前,对其它事务是不可见的。
- 持久性
一旦事务提交,则其所作的修改就会永久保存到数据库中。
这里的记忆方式是:事务是酸的。 Transaction is acid. 然后记忆 A代表 Atomic C 代表 consistency I 代表 isolation D代表 durability。然后对应ACID进行记忆,原子性——原子;一致性——能量守恒定律;隔离性——薛定谔猫;持久性——不可逆反应。
1.3.1.隔离级别
隔离级别里说了很多,但核心的还是对于几种问题的处理。
-
脏读:事务中的修改,即使没有提交,对其它事务也都是可见的。(好像信纸上写字,写了一半,墨水还没干,另一个人就着急拿过来看,墨水在信纸上流淌,很脏)
-
幻读:当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录时,会产生幻行。(我们要把所有桌子上的苹果换西瓜,换完了发现,有一个人又拿来了一个苹果,放在了桌子上。)
-
不可重复读:不可重复读,是指在数据库访问中,一个事务范围内两个相同的查询却返回了不同数据。(我们要桌子上第二个苹果,我们拿起来擦了擦,放在桌子上,这时候一个人吃了一口,我们又要第二个苹果时,发现被咬了一口。)
拓展阅读:脏读、幻读、不可重复读
然后,解释清了这些名词,我们理解下面这张表即可:
隔离级别 | 脏读可能性 | 不可重复读可能性 | 幻读可能性 | 每一行数据都上锁 |
---|---|---|---|---|
READ UNCOMMITTED(未提交读) | Yes | Yes | Yes | No |
READ COMMITTED(提交读) | No | Yes | Yes | No |
REPEATABLE READ(可重复读) | No | No | Yes | No |
SERIALIZABLE(串行化) | No | No | No | Yes |
顺带说一句,MySQL默认事务隔离级别为可重复读。InnoDB存储引擎通过多版本并发控制解决了幻读问题。