敦煌网站销售员怎么做,营销型网站五大系统 单仁,招聘网站开发技术维护,珠海建设局网站首页认识具有反复性。
之前以为理解了幻读#xff0c;最近看黑马的mysql教程以为再次加深了认识。然而现在认为之前的理解都是错误的#xff0c;而且网上很多关于幻读的解释#xff0c;都不太准确。 关于幻读的最佳解释还是要看官网mysql官网幻读解释 脏读和不可重复读比较好理…认识具有反复性。
之前以为理解了幻读最近看黑马的mysql教程以为再次加深了认识。然而现在认为之前的理解都是错误的而且网上很多关于幻读的解释都不太准确。 关于幻读的最佳解释还是要看官网mysql官网幻读解释 脏读和不可重复读比较好理解但有一个容易误解的地方就是在READ COMMITTED这个隔离级别下事务A查询某种condition下的结果集为R1此时事务B插入或者删除了符合这个condition的数据并提交事务。此时事务A再次查询结果集为R2与R1不一致个人认为这是幻读很容易让人以为这是不可重复读。
脏读侧重于读取到了其他事务未提交的数据。而不可重复读侧重于针对单条数据的更新同一事务中两次查询内容不一致。而幻读侧重于其他事务的插入和删除导致本事务查询结果集数量和范围不一致。
我们最先认识到的就是MySql隔离级别默认是REPEATABLE READ这个隔离级别可能出现幻读。由于先入为主反而容易产生误解导致很多人在这个隔离级别下演示幻读。然而这个隔离级别下由于MySql使用了MVCC机制在事务开启时会创建一个一致性视图普通的Select语句即快照读都是基于这个视图获取数据。这种情况下其他事务无论删除还是插入都不会影响这个一致性视图。此事务下的普通Select查询结果一致一定程度上避免了幻读。所以很多教程演示的两次查询结果一致并没有演示出幻读的现象。当然很多教程在两次查询中间会演示事务B插入一条主键为某个值的数据。然后事务A查询这个主键数据不存在然后做插入操作结果失败了然后再次查询结果这个主键的数据还是不存在。插入失败会提示主键重复在insert时会执行当前读读取的是数据库当前最新的数据可以查到此主键已经存在前面查询是不存在的可以理解为变相的演示出了幻读。
补充 快照读读取的是事务开启时特定时间点的数据库“快照”数据基于多版本并发控制MVCC机制实现。不管事务执行多久期间其他事务如何更新提交数据快照读看到的始终是最初那个时间点的数据版本保证同一事务内多次读取数据的一致性。例如在一个长事务中多次执行普通的SELECT语句结果都一样。 当前读读取的是数据库当前最新的、真实的数据状态无视多版本情况。每次当前读获取的数据反映的都是当下这一瞬间的数据库真实情况所以不同时间的当前读获取的数据很可能不同。 执行SELECT… FOR UPDATE 、SELECT… LOCK IN SHARE MODE、UPDATE、DELETE、INSERT语句时是当前读因为它们要获取数据库当下最新数据。 在“读已提交”READ COMMITTED 隔离级别下MySQL也有MVCC机制但它无法避免幻读 在“读已提交”级别事务每次执行快照读时都会获取最新已提交事务对应的版本而非固定在事务开启时的版本。这意味着新插入并提交的数据能被后续快照读捕捉到没办法维持同一事务内多次查询结果的稳定性所以抵御不了幻读。 反观“可重复读”隔离级别事务开启时生成固定一致性视图全程基于此视图做快照读新数据进不来能较好防控幻读“读已提交”的MVCC 因频繁更新读取版本给幻读留了“口子”。