事务特性有ACID 原子性,一致性,隔离性,持久性四个,英文对应atomicity,consistency,isolation,durability。隔离性单独来说有读未提交,读已提交,可重复读,串行化。以上是概念总结,下面根据实例做些解释。Innodb默认事务隔离级别是可重复读,但可重复读会有幻读的情况出现,幻读其实相对比较难理解,以下通过一个简单例子来说明,例子按步骤执行。
首先,查看当前的事务隔离级别。
show variables like '%isolation%';
事务1开启,并查询数据总数
tx11.png事务2开启,并查询总数
tx21.png
事务2添加记录,并查询总数
tx22.png
事务1,查询总数,可以看到数据量没变,因为事务2没有提交,目前为止是正确的。
tx12.png
事务2提交
tx23.png
事务1,查看总数并更新记录,此处是重点,可以看到count(*) 查的记录和实际更新的记录对不上,count(*)操作像是出现幻觉。
tx13.png
以上可以很清楚的看到所谓幻读是怎么产生的,除了串行化可以避免幻读,后续会介绍在RR下幻读的预防原理。
网友评论