MySQL的事务隔离级别
问题分析
隔离级别是为了解决多个并行事务竞争导致的数据安全问题的一种规范,具体来说 ,多个事务竞争可能会产生三种不同的现象:
- 假设有两个事务 T1/T2 同时在执行,T1 事务有可能会读取到 T2 事务未提 交的数据,但是未提交的事务 T2 可能会回滚,也就导致了 T1 事务读取到最终不一定存在的数据产生脏读的现象。
- 假设有两个事务 T1/T2 同时执行,事务 T1 在不同的时刻读取同一行数据的时候结果可能不一样 ,从而导致不可重复读的问题。
- 假设有两个事务 T1/T2 同时执行,事务 T1 执行范围查询或者范围修改 的过程中,事务 T2 插入了一条属于事务 T1 范围内的数据并且提交了,这时候在事 务 T1 查询发现多出来了一条数据,看起来像是产生了幻觉 ,这种现象称为幻读。
四种隔离级别
在某些场景下,不能接受以上某些现象的存在 ,所以在 SQL 标准中定义了四种隔离级别 ,分别是:
-
读未提交 ,在这种隔离级别下 ,可能会产生脏读、不可重复读、幻读等问题
-
读已提交(RC) ,在这种隔离级别下 ,可能会产生不可重复读和幻读问题
-
可重复读(RR) ,在这种隔离级别下 ,可能会产生幻读问题
-
串行化 ,在这种隔离级别下 ,多个并行事务串行化执行 ,不会产生安全性问题
小结
-
这四种隔离级别里面,只有串行化解决了全部的问题,但也意味着这种隔离级别的性能是最低的
-
在 Mysql 里面, InnoDB 引擎默认的隔离级别是 RR(可重复读) ,基本保证了事务 ACID 特性中的隔离性特征,且性能不至于太差。