为了达到事务的四大特性,数据库定义了 4种不同的事务隔离级别,由低到高依次为Read uncommitted. Read committed、Repeatable read、 Serializable,这四个级别可以逐个解决脏读、不可重复、幻读这几类问题。
脏读、不可重复读、 幻读这几类问题。
隔离级别 脏读 不可重复读 幻影读
READ-UNCOMMITTED J J J
READ-COMMITTED X J J
REPEATABLE-READ X X J
SERIALIZABLE
SQL标准定义了四个隔离级别:
1、READ-UNCOMMITTED (读取未提交):
最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。
2、READ-COMMITTED(读取已提交):允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。
3、 REPEATABLE-READ (可重复读):
对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
4、 SERIALIZABLE (可串行化):
最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。
注意:
1、 这里需要注意的是:MySQL默认采用的REPEATABLE_READ隔离级别Oracle默认采用的READ_COMMITTED 隔离级别
2、 事务隔离机制的实现基于锁机制和并发调度。其中并发调度使用的是MVVC (多版本并发控制),通过保存修改的旧版本信息来支持并发一致性读和回滚等特性。
3、 因为隔离级别越低,事务请求的锁越少,所以大部分数据库系统的隔离级别都是 READ-COMMITTED(读取提交内容),但是你要知道的是InnoDB存储引擎默认使用 REPEATABLE-READ (可重读)并不会有任何性能损失。
4、 InnoDB存储引擎在分布式事务的情况下一般会用到SERIALIZABLE(可串行化)隔离级别。
Was this helpful?
0 / 0