事务隔离级别和幻读

事务特性有ACID 原子性,一致性,隔离性,持久性四个,英文对应atomicity,consistency,isolation,durability。隔离性单独来说有读未提交,读已提交,可重复读,串行化。以上是概念总结,下面根据实例做些解释。Innodb默认事务隔离级别是可重复读,但可重复读会有幻读的情况出现,幻读其实相对比较难理解,以下通过一个简单例子来说明,例子按步骤执行。
首先,查看当前的事务隔离级别。
show variables like '%isolation%';

事务隔离级别和幻读_第1张图片
tx_isolation.png

事务1开启,并查询数据总数

事务隔离级别和幻读_第2张图片
tx11.png

事务2开启,并查询总数


事务隔离级别和幻读_第3张图片
tx21.png

事务2添加记录,并查询总数


事务隔离级别和幻读_第4张图片
tx22.png

事务1,查询总数,可以看到数据量没变,因为事务2没有提交,目前为止是正确的。


事务隔离级别和幻读_第5张图片
tx12.png

事务2提交
事务隔离级别和幻读_第6张图片
tx23.png

事务1,查看总数并更新记录,此处是重点,可以看到count(*) 查的记录和实际更新的记录对不上,count(*)操作像是出现幻觉。


事务隔离级别和幻读_第7张图片
tx13.png

以上可以很清楚的看到所谓幻读是怎么产生的,除了串行化可以避免幻读,后续会介绍在RR下幻读的预防原理。

你可能感兴趣的:(事务隔离级别和幻读)