可重复读为什么解决不了幻读(可重复读为什么会出现幻读)
大家好!今天让创意岭的小编来大家介绍下关于可重复读为什么解决不了幻读的问题,以下是小编对此问题的归纳整理,让我们一起来看看吧。
开始之前先推荐一个非常厉害的Ai人工智能工具,一键生成原创文章、方案、文案、工作计划、工作报告、论文、代码、作文、做题和对话答疑等等
只需要输入关键词,就能返回你想要的内容,越精准,写出的就越详细,有微信小程序端、在线网页版、PC客户端
创意岭作为行业内优秀的企业,服务客户遍布全球各地,如需了解SEO相关业务请拨打电话175-8598-2043,或添加微信:1454722008
本文目录:
一、数据库的幻读什么意思???
幻读:是指两次查询结果集不一样了。比如:
两个并发事务A、B。在T1这个时刻,事务A通过筛选条件获取到的记录是10条。此时并发事务B往数据库插入一条满足事务A查询条件的记录。这时A还没有结束,在事务内再次获取数据时以相同的条件筛选,结果筛选出了11条记录。这就是幻读。
你可以这样理解:
脏读关注的是当前获得的结果与数据库结果不一样,数据不同。
不可重复读关注的同一事务内两次读取,但数据不同。
以上两个都是同一结果集。
而幻读强调的是,结果集变了。
幻读造成的原因是,共享锁并不能锁住我筛选的结果集以外的数据,即便你开启了可重复读,想要避免的话,可以更改事务隔离级别。
二、mysql如何解决幻读
幻读是指:在一个事务中,读取到了其他已经提交的事务插入的数据行。
MySQL在解决脏读、不可重复的读时候,使用了MVCC一致性视图,同时配合行锁来解决。
至于幻读的解决方式,MySQL引入了临键锁,通过间隙锁可以避免在两个行之间插入数据,从而避免了一个事务在读取的过程中,读取到其他事务插入的数据行。
三、大白话讲解脏写、脏读、可重复读和幻读
当多个事务并发执行的时候,会导致什么问题?
我们知道,执行sql是在buffer pool中对数据进行查询或者修改。如若多个事务同时更新一行数据会出现什么问题?
当事务A和事务B同时去更新同一行数据时,事务A先更新,事务B后更新。
那么此时,undo log就会记录了事务A所改数据的旧值,假设旧值为 null。随后事务B也对该行数据进行了更新,覆盖掉A更新的值。此时事务A突然发生回滚,那么就会根据它的undo log进行回滚。
事务A进行了回滚,那么该数据的值就变成了更新前的null值。
然而,事务B并不知道此事,发现自己更新的值没有了。这就是 脏写 。
本质上,就是一个事务修改了另外一个没提交的事务的值(没提交有可能回滚),而导致有可能数据前后不一致的问题。
同样有事务A和事务B。事务A去更新了一行数据,事务B刚好查询到了该行数据,此时事务B拿到的值为A更新的值。
事务B拿到值后便去业务系统进行各种业务逻辑处理等等,这时,事务A突然回滚了,又把undo log的值回滚到该行数据。紧接着事务B再次查询该行数据的时候,发现前后的值不一样。这就是 脏读 。
本质上,就是一个事务查询到了另个一个未提交的事务的值,而导致有可能数据前后不一致的问题。
在避免脏读的前提下,还有可能出现的 不可重复读 。
这类情况是在什么场景下发生的呢?
假设,有一个前提,事务B在更新某行数据,但暂未提交,在未提交事务的时间里,事务A是读不到该行数据的。必须等事务B提交了,事务A才能读取到它修改的值。这样就可以避免脏读。
这时,假设事务A第一次查询到的值为A值。
事务B把该行数据的值改为B值并立即提交事务。而事务A尚未提交事务,在事务执行期间进行第二次查询,所以事务A第二次查询到的值为B值。
紧接着事务C再次更新数据为C值,并提交了事务。此时,事务A在未提交事务的情况下,进行第三次查询,查到的值为C。
不可重复读就是以上这种情况,事务A未提交事务,每次读到的数据可能都不一样。
通过以上分析,那可重复读,就很好理解了。即希望,事务A每次读到的值都是A值。
假设事务A需要多次批量查询数据,第一次查询到了十条数据
此时事务B往表里插入了几条数据,且B提交了事务,那么此时,就会多出几行数据
接着事务A再次进行查询时,由于事务B的提交,导致事务A查询多出来了几条数据
这样就出现了和查询第一次没见到的数据,就是 幻读 。
本质上,就是一个事务用一样的sql进行多次查询,每次查询到没见过的数据。
四、脏读 幻读 不可重复读
1、脏读:事务A读取了事务B更新的数据,然后B回滚操作咐睁,那么A读取到的数据是脏数据。
2、不可重复读:事务A多次读取同一数据,事务B在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果不一致。
3、幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管没卜理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。
三者关系:
不可重复读(Non-repeatable Reads):一个事务对同一行数据重复读取两次,但是却得到了不同的结果。
包括以下情况:
(1)虚读:事务T1读取某一数据后,事务T2对其做了修改,当事务T1再次读该数据时得到与前一次不同的值。
(2) 幻读(Phantom Reads):事务在操作过程中进行两次查询,第二次查询的结果包含了第一次查询中未出现的数据或者缺少了第一次枯简穗查询中出现的数据(这里并不要求两次查询的SQL语句相同)。这是因为在两次查询过程中有另外一个事务插入数据造成的。
以上就是关于可重复读为什么解决不了幻读相关问题的回答。希望能帮到你,如有更多相关问题,您也可以联系我们的客服进行咨询,客服也会为您讲解更多精彩的知识和内容。
推荐阅读: