电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

MySQL如何解決幻讀問題

瀏覽:131日期:2023-10-17 19:37:00
目錄前言一、什么是幻讀?二、幻讀有什么問題?(1)需要單獨解決(2)間隙鎖引發的并發度三、如何解決幻讀?三、總結前言

我們知道MySQL在可重復讀隔離級別下別的事物提交的內容,是看不到的。而可提交隔離級別下是可以看到別的事務提交的。而如果我們的業務場景是在事物內同樣的兩個查詢我們需要看到的數據都是一致的,不能被別的事物影響,就使用可重復讀隔離級別。這種情況下RR級別下的普通查詢(快照讀)依靠MVCC解決“幻讀”問題,如果是“當前讀”的情況需要依靠什么解決“幻讀”問題呢?這就是本博文需要探討的。

在探討前可以看下之前的博文(MySQL是如何實現事務隔離?),主要介紹隔離級別的具體技術細節,讀過以后看此篇文章可能更有幫助。

注:本博文討論的“幻讀”都是指在“可重復讀”隔離級別下進行。

一、什么是幻讀?

假設我們有表t結構如下,里面的初始數據行為:(0,0,0),(1,1,1),(2,2,2),(3,3,3),(4,4,4),(5,5,5)

CREATE TABLE `t`( `id` INT(11) NOT NULL, `key` INT(11) DEFAULT NULL, `value` INT(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `value` (`value`)) ENGINE = InnoDB;INSERT INTO tVALUES (0, 0, 0), (1, 1, 1), (2, 2, 2), (3, 3, 3), (4, 4, 4), (5, 5, 5)

假設select * from where value=1 for update,只在這一行加鎖(注意這只是假設),其它行不加鎖,那么就會出現如下場景:

MySQL如何解決幻讀問題

Session A的三次查詢Q1-Q3都是select * from where value=1 for update,查詢的value=1的所有row。

T1:Q1只返回一行(1,1,1); T2:session B更新id=0的value為1,此時表t中value=1的數據有兩行 T3:Q3返回兩行(0,0,1),(1,1,1) T4:session C插入一行(6,6,1),此時表t中value=1的數據有三行 T5:Q3返回三行(0,0,1),(1,1,1),(6,6,1) T6:session A事物commit。

其中Q3讀到value=1這一樣的現象,就稱之為幻讀,幻讀指的是一個事務在前后兩次查詢同一個范圍的時候,后一次查詢看到了前一次查詢沒有看到的行。

先對“幻讀”做出如下解釋:

在可重復讀隔離級別下,普通的查詢是快照讀,是不會看到別的事務插入的數據的。因此, 幻讀在“當前讀”下才會出現(三個查詢都是for update表示當前讀); 上面session B的修改update結果,被session A之后的select語句用“當前讀”看到,不能稱為幻讀,幻讀僅專指“新插入的行”。二、幻讀有什么問題?(1)需要單獨解決

眾所周知,select ...for update語句就是將相應的數據行鎖住,比如session A在T1時刻的Q1查詢語句:select * from where value=1 for update就是將value=1的數據行鎖住,但顯然如果是上述的場景發生,此時的for update語義被破壞了(并沒有鎖住value=1的數據行)。

即使把所有的記錄都加上鎖,還是阻止不了新插入的記錄,所以“幻讀”問題要單獨拿出來解決。沒法依靠MVCC或者行鎖機制來解決。這就引出“間隙鎖”,是另外一種加鎖機制。

(2)間隙鎖引發的并發度

間隙鎖引入以后,可能會導致同樣語句鎖住更大的范圍,這可能就會影響了并發度。具體請看下面介紹

三、如何解決幻讀?

產生幻讀的原因是,行鎖只能鎖住行,但是新插入記錄這個動作,要更新的是記錄之間的“間隙”。因此,為了解決幻讀問題,InnoDB只好引入新的鎖,也就是間隙鎖(Gap Lock)。

間隙:比如表中加入6個記錄,0,5,10,15,20,25。則產生7個間隙:

MySQL如何解決幻讀問題

在一行行掃描的過程中,不僅將給行加上了行鎖,還給行兩邊的空隙也加上了間隙鎖。這樣就確保了無法再插入新的記錄。

間隙鎖和行鎖合稱next-key lock,每個next-key lock是前開后閉區間(間隙鎖開區間,next-key lock前開后閉區間):

間隙鎖與間隙鎖之間是不存在沖突的,沖突的是往間隙里插入一條記錄。 

MySQL如何解決幻讀問題

表t中是沒有value=7這個數據的,所以Q1加的間隙鎖(1,5),而Q2也是加的這個間隙鎖,兩者不沖突都是為了保護這個間隙不允許插入值。

在表t初始化后,假設表的數據如下:

MySQL如何解決幻讀問題

如果用select * from for update執行,則會把整個表所有記錄鎖起來,就形成了7個next-key lock,分別是(-∞,0]、(0,2]、(2,4]、(4,6]、(6,8]、(8, 10]、(10, +supremum]

間隙鎖的引入,可能會導致同樣的語句鎖住更大的范圍,是會影響了并發度

假設發生如下場景:

MySQL如何解決幻讀問題

 則明顯發生了死鎖,分析如下:

Q1:執行select …for update語句,由于id=9這一行并不存在,因此會加上間隙鎖 (8,10); Q2:執行select …for update語句,同樣會加上間隙鎖(8,10),間隙鎖之間不會沖突,因 此這個語句可以執行成功; session B 試圖插入一行(9,9,9),被session A的間隙鎖擋住了,只好進入等待; session A試圖插入一行(9,9,9),被session B的間隙鎖擋住了。

有上述可知間隙鎖的引入,可能會導致同樣語句鎖住更大的范圍,這其實是影響了并發度。

為了解決幻讀問題可以采用讀可提交隔離級別,間隙鎖是在可重復讀隔離級別下才會生效的。所以如果把隔離級別設置為讀提交的話, 就沒有間隙鎖了。但同時,你要解決可能出現的數據和日志不一致問題,需要把binlog格式設置為row,也就是說采用“RC隔離級別+日志格式binlog_format=row”組合。

三、總結 RR隔離級別下間隙鎖才有效,RC隔離級別下沒有間隙鎖; RR隔離級別下為了解決“幻讀”問題:“快照讀”依靠MVCC控制,“當前讀”通過間隙鎖解決; 間隙鎖和行鎖合稱next-key lock,每個next-key lock是前開后閉區間; 間隙鎖的引入,可能會導致同樣語句鎖住更大的范圍,影響并發度。

到此這篇關于MySQL如何解決幻讀問題的文章就介紹到這了,更多相關MySQL 幻讀內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: MySQL 數據庫
相關文章:
主站蜘蛛池模板: 环氧树脂地坪_防静电地坪漆_环氧地坪漆涂料厂家-地壹涂料地坪漆 环球电气之家-中国专业电气电子产品行业服务网站! | 合金耐磨锤头_破碎机锤头_郑州市德勤建材有限公司 | 超声波反应釜【百科】-以马内利仪器 | 北京开业庆典策划-年会活动策划公司-舞龙舞狮团大鼓表演-北京盛乾龙狮鼓乐礼仪庆典策划公司 | 穿线管|波纹穿线管|包塑金属软管|蛇皮管?闵彬专注弱电工程? | 数显水浴恒温振荡器-分液漏斗萃取振荡器-常州市凯航仪器有限公司 | 广州迈驰新GMP兽药包装机首页_药品包装机_中药散剂包装机 | 新能源汽车电池软连接,铜铝复合膜柔性连接,电力母排-容发智能科技(无锡)有限公司 | CE认证_产品欧盟ROHS-REACH检测机构-商通检测 | 青岛侦探调查_青岛侦探事务所_青岛调查事务所_青岛婚外情取证-青岛狄仁杰国际侦探公司 | 湖州织里童装_女童男童中大童装_款式多尺码全_织里儿童网【官网】-嘉兴嘉乐网络科技有限公司 | 铁艺,仿竹,竹节,护栏,围栏,篱笆,栅栏,栏杆,护栏网,网围栏,厂家 - 河北稳重金属丝网制品有限公司 山东太阳能路灯厂家-庭院灯生产厂家-济南晟启灯饰有限公司 | 上海恒驭仪器有限公司-实验室平板硫化机-小型平板硫化机-全自动平板硫化机 | 真空泵维修保养,普发,阿尔卡特,荏原,卡西亚玛,莱宝,爱德华干式螺杆真空泵维修-东莞比其尔真空机电设备有限公司 | 继电器模组-IO端子台-plc连接线-省配线模组厂家-世麦德 | 电车线(用于供电给电车的输电线路)-百科 | 大型多片锯,圆木多片锯,方木多片锯,板材多片锯-祥富机械有限公司 | 防爆电机_防爆电机型号_河南省南洋防爆电机有限公司 | 昆明挖掘机修理厂_挖掘机翻新再制造-昆明聚力工程机械维修有限公司 | 面粉仓_储酒罐_不锈钢储酒罐厂家-泰安鑫佳机械制造有限公司 | SDI车窗夹力测试仪-KEMKRAFT方向盘测试仪-上海爱泽工业设备有限公司 | 全自动变压器变比组别测试仪-手持式直流电阻测试仪-上海来扬电气 | 电动葫芦|防爆钢丝绳电动葫芦|手拉葫芦-保定大力起重葫芦有限公司 | 北京中航时代-耐电压击穿试验仪厂家-电压击穿试验机 | 上海瑶恒实业有限公司|消防泵泵|离心泵|官网 | 达利园物流科技集团-| 无菌实验室规划装修设计-一体化实验室承包-北京洁净净化工程建设施工-北京航天科恩实验室装备工程技术有限公司 | 挤塑板-XPS挤塑板-挤塑板设备厂家[襄阳欧格] | 谈股票-今日股票行情走势分析-牛股推荐排行榜 | 全自动贴标机-套标机-工业热风机-不干胶贴标机-上海厚冉机械 | 贵州水玻璃_-贵阳花溪闽兴水玻璃厂 | 电动车头盔厂家_赠品头盔_安全帽批发_山东摩托车头盔—临沂承福头盔 | 杭州厂房降温,车间降温设备,车间通风降温,厂房降温方案,杭州嘉友实业爽风品牌 | 档案密集柜_手动密集柜_智能密集柜_内蒙古档案密集柜-盛隆柜业内蒙古密集柜直销中心 | 流程管理|流程管理软件|企业流程管理|微宏科技-AlphaFlow_流程管理系统软件服务商 | 西子馋火锅鸡加盟-太原市龙城酉鼎餐饮管理有限公司 | 贵阳用友软件,贵州财务软件,贵阳ERP软件_贵州优智信息技术有限公司 | 北京康百特科技有限公司-分子蒸馏-短程分子蒸馏设备-实验室分子蒸馏设备 | 防爆电机生产厂家,YBK3电动机,YBX3系列防爆电机,YBX4节防爆电机--河南省南洋防爆电机有限公司 | 动物解剖台-成蚊接触筒-标本工具箱-负压实验台-北京哲成科技有限公司 | 活性炭-蜂窝-椰壳-柱状-粉状活性炭-河南唐达净水材料有限公司 |