我由幻读而明白了数据库事务
刚开始接触数据库事务的时候,总会被脏读,不可重复读,幻读,读未提交,读已提交,可重复读等等这些“读”名词整的特别混乱。只能去硬记数据库事务的级别,以及每个级别可以解决的问题,和不同数据库实现的事务级别,直到后来彻底看完innodb引擎对事务的处理,才算彻底理清这些事务之间的关系,当别人再问起来时,可以马上根据底层原理说清楚与理论的关系。
本文中还是以innodb引擎为例来进行说明,其他数据库或引擎所知甚少就不谈及了。
简单的说事务就是保证一组操作要么全部成功要么全部失败,提到事务就会说起事务特性ACID(原子性,一致性,隔离性,持久性),这里我们主要说事务的隔离性。
SQL 标准定义了四个隔离级别:
- READ-UNCOMMITTED(读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。
- READ-COMMITTED(读取已提交): 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。
- REPEATABLE-READ(可重复读): 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
- SERIALIZABLE(可串行化): 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。
还有下面这个看似简单实则迷惑的表格
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
READ-UNCOMMITTED | √ | √ | √ |
READ-COMMITTED | × | √ | √ |
REPEATABLE-READ | × | × | √ |
SERIALIZABLE | × | × | × |