范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

MySQL如何解决幻读

  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);
  什么是幻读
  在可重复读的隔离级别下,我们如果只对id=5(也就是d=5由于d上没有索引,所以会走主键索引树)加行锁,我们可以分析以下SessionA会出现什么情况: Q1查询只会返回id=5这一行,也就是(5,5,5) T2时刻Session B把id为0这一行的d值改成5,因此Q2查询查出来的是id=0和id=5的这两行(0,0,5),(5,5,5) T4时刻,Session C插入一行(1,1,5),因此Q3查询查出来的是id=0、1、5的这三行(0,0,5),(1,1,5),(5,5,5)
  注意:上述Session A中查询都是当前读,关于当前读可以见MySQL MVCC(多版本控制)这篇文章。
  Q3读到id=1这一行的现象成为幻读。 幻读是指一个事务在前后两次查询同一个范围的数据的时候,后一次查询查到了第一次查询没有查到的行 。
  在可重复隔离级别下,普通的查询时快照读,是无法看到别的事务插入的数据的,只有当前读才会出现幻读 。
  幻读有什么问题? 语义上带来了破坏。
  Session A在T1时刻就声明我要把所有d=5的行锁住,不允许别的事务进行读写操作,但是实际上别的事务可以破坏这个声明。 数据一致性上会有问题。
  经过T1时刻,id=5这一行变成(5,5,100),当然这个结果最终是在T6时刻进行提交 经过T2时刻,id=0这一行变成了(0,5,5) 经过T4时刻,表里面新生成了一行(1,5,5)
  数据似乎很正常没有什么问题,但是如果你去分析binlog就会发现有问题了: T2时刻,Session B事务提交,写入两条语句; T4时刻,Session C事务提交,写入两条语句; T6时刻,Session A事务提交,写入update t set d=100 where d=5这条语句
  上述形成的binlog如下: -- binlog的模式是statement; 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*/
  这个binlog如果被拿到备库执行或者用来克隆一个数据库,这三行的结果会变成(0,5,100)、(1,5,100)和(5,5,100),此时id=0和id=1这两行就出现了数据不一致。
  如何解决幻读?
  产生幻读的原因就是行锁只能锁住行,插入动作更新的是记录之间的间隙。因此为了解决幻读问题,InnoDB引入了间隙锁。
  什么是间隙锁?
  在文章开始的时候我们插入了6条数据,这就会产生7个间隙,如下: (- , 0) (0, 5) (5, 10) (10, 15) (15, 20) (20, 25) (25, + )
  当我们在执行select * from t where d=5 for update的时候,除了给数据库已有的行加行锁以外,还会对7个间隙加锁,这样确保了没有拿到锁的事务无法插入新的记录。
  间隙锁之间没有冲突,跟间隙锁冲突的是往这个间隙中插入一个记录的操作 。
  什么是next-key lock?
  间隙锁和和行锁合称next-key lock,每个next-key lock都是前开后闭区间。
  select * from t where d=5 for update在执行的时候将形成7个next-key lock: (- , 0] (0, 5] (5, 10] (10, 15] (15, 20] (20, 25] (25, + ]
  其中+ 在这里是InnoDB给每个索引加了一个不存在的最大值。
  间隙锁导致死锁?
  Session B的insert会被阻塞,Session A在执行insert的时候会检测到死锁,如下图:
  Session A执行select for update,由于id=8这一行并不存在,因此会加上间隙锁(5,10) Session Bz执行select for update同样也会加上间隙锁,间隙锁之间并不冲突,因此可以执行成功 Session B尝试插入(9,9,9),被Session A的间隙锁阻塞,只好进入等待 Session A尝试插入(9,9,9),被Session B的间隙锁阻塞
  此时两个Session形成死锁等待,InnoDB的死锁检测发现死锁关系,让Session A的insert 语句报错返回。
  间隙锁是在可重复读隔离级别下才会生效,如果将隔离级别设置为读提交,就不会有间隙锁了,但是同时需要解决数据和日志不一致的问题(需要把binlog格式设置为ROW) 。

夏天海边拍照片,咋拍更好看,这5个摄影技巧,帮你海边照更美夏天已经到了,怎么能够在夏天,拍出漂亮的海边照片呢?这篇摄影教程,介绍5个海边摄影技巧,帮你在海边拍出美照。一体现沙滩。来到海边,可以先以沙滩为背景,来一张照片,让被拍摄的人,手里夏天,少不了一条白色裤子,这样穿清新又亮眼,稳赚回头率气温正在逐渐地攀升,不少姐妹又开始给自己的衣柜来一轮大换血。而要说春夏时节最不能错过的单品种类,那一定是白色裤子了,白色属于经典色系,虽然无色感,但却有着极高的亮度。与裤装结合,可夏天穿九分裤,该如何搭配上衣鞋子?这些穿搭技巧,实用好借鉴九分裤作为最为基础百搭的裤装,想必大部分姐妹的衣橱里都会有这么几条吧!但越基础的单品就越难搭配,如果你想把九分裤穿出时髦感,可不是一件容易的事情!那么,今年夏天,我们穿九分裤,到底91分钟绝平,22!港超冠军创历史首进亚冠16强,球员哭成泪人北京时间5月1日晚,亚冠小组赛J组结束一场比赛,杰志22战平神户胜利船,积7分成为其中一个成绩最好的小组第二,队史首次小组出线,创造历史。本赛季杰志跟日本球队神户胜利船泰超球队清莱决赛对阵出炉!32岁世界冠军1716绝杀晋级,会师奥沙利文北京时间2022年5月1日,斯诺克世锦赛结束第15比赛日争夺,两场半决赛先后结束,决赛阵容正式出炉。32岁的特鲁姆普以17比16绝杀47岁的马克威廉姆斯,职业生涯第3次闯进世锦赛决31岁杨洋遭遇霸总反噬,端着的枷锁靠热血兵王打破2018年武动乾坤开播前,娱记阿狸在上海采访杨洋,他说网上说我什么都能忍,可他们说我拍戏不背台词,这个我忍不了。聊了一会儿,他又叹了口气,别问拍戏受伤这些事了,否则又会有人说我卖惨演员陈龙家门口摆摊剪头!梳子揣兜拿剪刀姿势专业,邻居纷纷捧场近日,著名演员陈龙的妻子章龄之在社交平台晒出几张照片。是老公陈龙在家门口摆摊理发的照片。看起来,陈龙一家的理发业务已经推广到邻居了。从画面中看到,陈龙一身休闲的打扮,口袋里还装着一陈凯琳顶着这张脸还自卑?她对自己的美毫无自知之明编辑小颜如果说最近小颜看到了什么消息是最离谱的,那一定是郑嘉颖的妻子陈凯琳在采访中说自己自卑的这条消息了。毕竟曾经看过她的作品的嗑颜部,都认为她足够漂亮,别说郑嘉颖了,这位美人搭配尹恩惠人生从来没有白走的路,走过的每一步都要算数影视杂谈沉寂许久的尹恩惠登上最新一期黄金渔场,主动消费自己,谈及与金钟国组成的韩国家喻户晓的CP,试图唤起观众的回忆。虽然有童年滤镜的加持,看着这样的尹恩惠还是不禁感到唏嘘。尹恩惠看蔡少芬如何几句话,让张晋如此爱自己再挑剔的老公也能轻松拿下看蔡少芬张晋参加的我最爱的女人们的时候被蔡少芬的情商折服,怪不得蔡少芬48岁了还能牢牢抓住张晋的心。大家都说蔡少芬是炫夫狂魔,逮着时间就花式夸张晋,只要说起老公就是满满少女感的崇拜状告旗下艺人,气疯张艺兴,尚雯婕这是怎么了?落空。再落空。每到选人环节,留给尚雯婕的,仅剩一地尴尬。想要的人,她留不住。放手之后,又恶语相向。这就是她的处境。乐队选人第一轮。周洁琼一袭红衣,犹抱琵琶半遮面。中式美感,国风演绎
袁心玥正式回应!恭喜中国女排,恭喜蔡斌,这回可以安心了北京时间6月23日,在世界女排联赛菲律宾站打完之后,中国女排也迅速转战保加利亚站进行备战,由于上一站比赛,中国女排的整体表现并不理想,因此,国内媒体和球迷对中国队也产生了很大的不满匈牙利正太成为泳坛新王者?米拉克克里斯托夫请大家尊重原创和作者的劳动成果,如发现转载,立即投诉平台处理。作者约什高2022年的世界游泳锦标赛正在匈牙利布达佩斯举行。虽然我们的全民老公,奥运冠军汪顺状态不佳,但依旧无法影响我终于知道卢卡库为什么要回国米了!国米近5个赛季最佳组合进球数201718赛季最佳组合佩里西奇伊卡尔迪进球数11球29球,总进球数40球201819赛季最佳组合佩里西奇伊卡尔迪进球数811,总进球数19球201920赛季最佳组合卢卡库劳塔罗进江苏男篮阵容大换血!三大主力球员离队,李楠重点培养四大新星经历短暂的假期之后,CBA各支球队又开始再次集结训练,为新赛季做好准备。江苏男篮上赛季的成绩不够理想,仅仅取得5胜33负的成绩,在短暂调整之后,李楠已经率队开始训练。从最近国内媒体巴萨今夏引援目标有10人,已敲定2人剩下8人能来几人?据每日体育报报道,巴萨今年夏窗引援目标有10位球员,其中已经敲定两人,那就是免签切尔西的丹麦中卫克里斯滕森和AC米兰的科特迪瓦中场凯西,剩下8个引援目标情况如下莱万拜仁的波兰前锋,全国健身瑜伽指导委员会是个什么机构?全国健身瑜伽指导委员会(以下简称指导委)是国家体育总局社会体育指导中心(以下简称体育总局社体中心)下设的负责全国健身瑜伽运动发展的组织机构。其主要任务是在体育总局社体中心的领导下,陈戌源清洗国足教练组,李霄鹏团队恐仅留1人,三大少帅将获重用北京时间6月23日,根据国内权威体育媒体足球报报道的消息可得知,国足现任主帅李霄鹏大概率会遭遇下课危机。当然除了媒体曝出的消息外,其他两个细节也能很好证明李霄鹏将告别国足的说法。第CBA最新猛料!曝周鹏或离队,刘志轩未交换球员,辽宁签下两中锋如今的CBA正式进入到了休赛期的高潮阶段,在近日也不断有球员进行交易转会,也可以说cba也已经越来越热闹了。而在今天CBA方面也是最新传来了三条猛料,让我们来一同关注一下。首先这第山东男篮3球员找到新下家1位加盟CBA冲冠队,2人高薪打海外联赛在今年的夏季休赛期,很多CBA俱乐部都开始对球队进行调整,其中力度最大的无疑就是青岛男篮和山东男篮了。在与吴庆龙分手后,青岛男篮请来了前浙江男篮的年轻主帅刘维伟。刘维伟上任后,马上国乒5人惨遭淘汰!男单爆冷输波兰选手,日本世界冠军大获全胜北京时间6月23日凌晨,乒乓球WTT斯洛文尼亚赛结束了第二个比赛日的较量,目前正赛名单已经出炉,中国队多达5人无缘晋级,而且男单2人连续输给波兰选手巴多沃斯基,真是让人没有想到!本马内是很罕见的那种无私的球员,这让我们更想得到他拜仁慕尼黑俱乐部近日为新援马内召开了首场见面发布会,俱乐部高层卡恩海纳萨利哈米季奇等人悉数出席,主教练纳格尔斯曼也作为观众参加了新闻发布会。在发布会结束后,纳格尔斯曼谈到了自己对于