云南省新农村建设网站,只有asp网站代码可以重新编译吗,班级优化大师下载安装,青岛建站开发「MySQL基础」不可重复读和幻读的区别 文章参考#xff1a; 在数据库中不可重复读和幻读到底应该怎么分#xff1f; 作者#xff1a;暖猫Suki、普通熊猫 文章目录「MySQL基础」不可重复读和幻读的区别一、概述二、小结一、概述
正好在琢磨这个问题#xff0c;也被搞得头昏…「MySQL基础」不可重复读和幻读的区别 文章参考 在数据库中不可重复读和幻读到底应该怎么分 作者暖猫Suki、普通熊猫 文章目录「MySQL基础」不可重复读和幻读的区别一、概述二、小结一、概述
正好在琢磨这个问题也被搞得头昏脑涨不对之处请牛人指正。
脏读、不可重复读、幻读网上介绍这几个概念的博文很多。天下博文一大抄都没有说清楚不可重复读和幻读的区别只有一篇文章略微提到了一点这里结合我的理解说一下。
其实这三种现象都是并发读写导致的。
“脏读”指读到了未提交的数据然后基于这个数据做了一些事情结果做完发现数据被回滚了。可以理解为领导还没下达正式任务你就凭着自己的揣摩开始干活结果活干完了任务的内容被改了。“不可重复读”好一点读到的是已提交的数据比如某个读事务持续时间比较长期间多次读取某个元组每次读到的都是被别人改过并已提交的不同数据。可以理解为在执行任务的过程中领导的指令一直在变。。但好歹是正式下达的指令。“幻读”是指读的过程中某些元组被增加或删除这样进行一些集合操作比如算总数平均值等等就会每次算出不一样的数。所以“不可重复读”和“幻读”都是读的过程中数据前后不一致只是前者侧重于修改后者侧重于增删。
个人认为严格来讲“幻读”可以被称为“不可重复读”的一种特殊情况没错的。但是从数据库管理的角度来看二者是有区别的。解决“不可重复读”只要加行级锁就可以了。而解决“幻读”则需要加表级锁或者采用其他更复杂的技术总之代价要大许多。这是搞数据库的那帮家伙非要把这两者区分开的动机吧。
禁止写时读避免了“脏读”对应隔离级别read committed。
禁止读时写避免了“不可重复读”对应隔离级别repeatable read。
而为了避免“幻读”干脆把整个表给锁住了只能是serialize了。
隔离级别越高并行度越低付出的代价越大。
顺便说一下phantom这个词是幻影幽灵的意思跟“幻读”的现象没有直接关系。很多文章说遇到“幻读”就像出现幻觉一样个人以为十分牵强。“幻读”就是软件工程中一个很普通的问题是人类思虑不周全的结果。老外工程师通过禁止读的时候修改解决了“不可重复读”的问题本以为万事大吉了谁知又出现了增加导致的不一致不由感慨我X真是个phantom。用中国话说就是真TM见鬼了。国内翻译成了“幻读”搞得很神秘逼格很高的样子。 二、小结 不可重复读是读异常但幻读则是写异常。 不可重复读是读异常的意思是如果你不多select几次你是发现不了你曾经select过的数据行已经被其他人update过了。避免不可重复读主要靠一致性快照。 幻读是写异常的意思是如果不自己insert一下你是发现不了其他人已经偷偷insert过相同的数据了。解决幻读主要靠间隙锁。