幻读是什么?幻读有什么问题

一:CREATE TABLE `t` (
  `id` int(11) NOT NULL,
  `c` int(11) DEFAULT NULL,
  `d` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `c` (`c`)
) ENGINE=InnoDB;

insert into t values(0,0,0),(5,5,5),
(10,10,10),(15,15,15),(20,20,20),(25,25,25);

begin;
select * from t where d=5 for update;
commit;

这条语句会命中d=5这一行,对应主键是id =5 ,这一行会加一个写锁。 由于d 上没有索引,这条语句查询的时候会做全表扫描。但是 不满足条件的5行记录上会不会加锁呢?

二:幻读是什么:

查询语句用的是当前读,并且加上了些锁。Q3读到id = 1 这一行的现象称为幻读。

1.在可重复读隔离级别下,普通查询是快照读,是不会看到别的事务插入的数据,幻读在当前读下才会出现。

2.sessionb 的修改结果被sessiona读到,不能称为幻读,幻读指的是行插入的行

幻读有什么问题:

1.语义上的。

sessonA是要给d=5的加锁。但是sessionB ,sessionC 都可以执行成功。sessionA只是给id = 5 加了锁。

2 。破坏了数据一致性

这个一致性,不止是数据库内部数据状态在此刻的一致性,还包含了数据和日志在逻辑上的一致性。

update t set d=5 where id=0; /*(0,0,5)*/
update t set c=5 where id=0; /*(0,5,5)*/

insert into t values(1,1,5); /*(1,1,5)*/
update t set c=5 where id=1; /*(1,5,5)*/

update t set d=100 where d=5;/* 所有 d=5 的行,d 改成 100*/

insert into t values(1,1,5); /*(1,1,5)*/
update t set c=5 where id=1; /*(1,5,5)*/

update t set d=100 where d=5;/* 所有 d=5 的行,d 改成 100*/

update t set d=5 where id=0; /*(0,0,5)*/
update t set c=5 where id=0; /*(0,5,5)*/

上边把表的所有数据都加了锁,但是还是插入了数据 。

如何解决幻读?

新插入的语句是更新的记录之间的间隙。为了解决这个问题,引入了间隙锁。

产生 了七个间隙 。

select * from t where d= 5 for update;,不止给6个记录加上了行锁。同时还加了7个间隙锁。这样就确保无法插入新的记录。

跟间隙锁存在冲突关系的是往这个间隙中插入一个记录,这个操作。间隙锁之间都不存在冲突关系。

这俩条语句都加了 (5,10)这个间隙锁,但是不冲突,不会吧sessionB阻塞住。

select * from t for update 是把整个表的所有记录锁起来。就形成了7个next-key-lock.

但是也会出现问题。就是会发生死锁;

可能会引出并发读。

原文地址:https://www.cnblogs.com/hanguocai/p/10195045.html

时间: 2024-11-10 02:06:01

幻读是什么?幻读有什么问题的相关文章

数据库事务隔离级别--读未提交,读已提交,重复读,序列化

参考原文:https://my.oschina.net/bigdataer/blog/1976010 上一篇文章讲述了:数据库主从复制,那么新的问题数据库读写分离对事物是否有影响? 1. 名词 读未提交read-uncommited 读已提交read-commited 重复读repeatable-->可能产生主从数据不一致问题 串行化serializable-->特殊场景-秒杀使用,一般不用 数据库事务的隔离级别有4个,由低到高依次为Read uncommitted.Read committe

我读经典(6):读《文明之光》有感

什么是文明?如果突然问大家这个问题,那么你可能会不知如何回答,感觉这是一个只可意会但不可言传的概念. 在新书<文明之光>中,吴军老师为我们带来了答案.继<浪潮之巅>和<数学之美>之后,吴军老师又出力作<文明之光>,将世界各地的主要文明为我们一一呈现和讲解.整套书现在出了第一册和第二册,加起来一共有16章.在这16章中,作者基本按照时间的顺序,从最古老的古埃及文明讲起,一直到美苏在航天方面的竞争为止,为大家展示了一幅生动有趣的历史画卷.全书文笔流畅.语言优美.

如何实现共享文件夹可读,文件不可读不可拷贝

如何实现共享文件夹,可以列出文件,而文件本身不可读,不可拷贝 问题:如何实现共享文件夹可读,文件不可读不可拷贝? 实验环境:win7 旗舰版.局域网 步骤及说明: 右击[右下角网络图标],进入"打开网络和共享中心",进入"更改高级共享设置",开启"启用密码保护共享"(说明:我启用该设置是为了访问共享时需要输入账户密码) 创建访问共享所需要的账户,右键"我的计算机"进入"管理",在"本地用户和组&q

我读经典(4):读《打造Facebook》有感

我第一次听说Facebook,是在用了国内的人人网很久之后.从上大学到研究生毕业,我几乎每天都要上人人网,发发日志.照片,看看其他同学有什么动向等等.个人感觉人人网使用起来非常的方便,拉近了人与人之间的距离,比QQ舒服多了. 某一天,我读到了一篇文章,主题是有关人人网的.文章里面说,人人网是中国的Facebook.这时,我便对Facebook产生了兴趣,接着上网去百度了一把,才知道它是全球最大的社交网络,于2004年2月4日正式上线,其主要创始人为美国哈佛大学的辍学生马克·扎克伯格(很有意思,比

回文指的是一个字符串从前面读和从后面读都一 样,编写一个算法判断一个字符串是否为回文。

回文指的是一个字符串从前面读和从后面读都一 样,编写一个算法判断一个字符串是否为回文. 要求: 1)采用链栈实现算法: 2)从键盘输入一个字符串,输出判断结果. #include"stdio.h" #include"stdlib.h" typedef char ElemType; typedef struct stnode { ElemType data; struct stnode *next; }StNode, *LinkStack; int huiwen(ch

数据库隔离级别,读已提交,读未提交

同样是后端开发,年薪50万和年薪20万的差距在哪里>>> 数据库事务的隔离级别有4个,由低到高依次为Read uncommitted.Read committed.Repeatable read.Serializable,这四个级别可以逐个解决脏读.不可重复读.幻读这几类问题. √: 可能出现    ×: 不会出现 事务的隔离级别 脏读 不可重复读 幻读 Read uncommitted √ √ √ Read committed--Sql Server , Oracle × √ √ Re

人生在世,不在于读多少,在于读什么?

有很多人在说中国人的阅读量很少,这话也对也不对.很多时候不是阅读量少,而是有质量的阅读不多.在竹简飘香的年代,能会有多少书?古代的老子.庄子.孔子读了多少书?可以说,在我们读完大学四年的时候,很多人的阅读量都超过了古代最牛的大学问家. 信息不是知识,知识不是智慧,选择越多也就越迷茫. 在纸张泛滥.信息充塞的年代,一个谎言的出现,需要几十万字去证明这个谎言的真假:一场婚礼的出现,纸媒报纸新媒体产生的文字垃圾超过了任何一部经典名著. 民国时期的文人,敢说能把唐以前的绝大部分书都读过,那是整整三千年的

我读经典(5):读《大话重构》迷你书有感

近期.我在一个QQ群里面看到有人在讨论一本书,叫做<大话重构>.在闲暇之余,我下载了该书的电子版,是一本迷你书,仅仅包括了4 章内容.读完这本迷你书,结合自身的工作.我想说一下自己对于重构的看法. 重构.是一把双刃剑,开发者不要轻易使用.举个样例来说,你如今正在从事某个行业的工作.但有人告诉你另外一个行业赚钱多并且快.于是你就非常纠结,究竟要不要改行呢?不改行吧,钱挣得少.改行吧,自己又是新手.对那个行业又不熟悉.这样的心理状态事实上就是开发者对于重构的态度,能够用"进退维谷&quo

python-----opencv读视频、循环读图片显示进度条

功能:opencv读视频,显示进度条,推动进度条快进.后退,按q退出.代码如下: import os import cv2 def nothing(emp): pass def jindu(name,video): cv2.namedWindow(name,0) cv2.resizeWindow(name, 800, 600) cap = cv2.VideoCapture(video) frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) loop_fl

读技术书籍一定要读最经典的

最近很多人问我读什么书,鉴于之前有空的时候也会读过一些书,特此整理一些分享给大家,如果有你读的很不错的书也欢迎留言推荐补充. 下面主要是还是针对 Java 工程师学习方向的相关书籍,我大致把进阶的书籍分为 Java 基础.数据库.网络.框架.架构.方法论和职场. 1, Java 基础 Java 基础主要还是围绕基础语法.多线程.JVM 和性能. 「基础」的书籍呢还是经典的<Java 编程思想>了,不过个人建议不必须那么早的看这本书,很多东西做项目多了,用的多了再回过头来看这本书效果会比较好.