日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

mysql在項目中怎么選事務(wù)隔離級別

瀏覽:231日期:2023-10-02 15:32:10
引言

開始我們的內(nèi)容,相信大家一定遇到過下面的一個面試場景

面試官:“講講mysql有幾個事務(wù)隔離級別?”你:“讀未提交,讀已提交,可重復(fù)讀,串行化四個!默認(rèn)是可重復(fù)讀”面試官:“為什么mysql選可重復(fù)讀作為默認(rèn)的隔離級別?”(你面露苦色,不知如何回答!)面試官:'你們項目中選了哪個隔離級別?為什么?'你:“當(dāng)然是默認(rèn)的可重復(fù)讀,至于原因。。呃。。。”(然后你就可以回去等通知了!)

為了避免上述尷尬的場景,請繼續(xù)往下閱讀!

Mysql默認(rèn)的事務(wù)隔離級別是可重復(fù)讀(Repeatable Read),那互聯(lián)網(wǎng)項目中Mysql也是用默認(rèn)隔離級別,不做修改么?OK,不是的,我們在項目中一般用讀已提交(Read Commited)這個隔離級別!

what!居然是讀已提交,網(wǎng)上不是說這個隔離級別存在不可重復(fù)讀和幻讀問題么?不用管么?好,帶著我們的疑問開始本文!

正文

我們先來思考一個問題,在Oracle,SqlServer中都是選擇讀已提交(Read Commited)作為默認(rèn)的隔離級別,為什么Mysql不選擇讀已提交(Read Commited)作為默認(rèn)隔離級別,而選擇可重復(fù)讀(Repeatable Read)作為默認(rèn)的隔離級別呢?

Why?Why?Why?

這個是有歷史原因的,當(dāng)然要從我們的主從復(fù)制開始講起了!主從復(fù)制,是基于什么復(fù)制的?

是基于binlog復(fù)制的!這里不想去搬binlog的概念了,就簡單理解為binlog是一個記錄數(shù)據(jù)庫更改的文件吧~

binlog有幾種格式?

OK,三種,分別是

statement:記錄的是修改SQL語句 row:記錄的是每行實際數(shù)據(jù)的變更 mixed:statement和row模式的混合

那Mysql在5.0這個版本以前,binlog只支持STATEMENT這種格式!而這種格式在讀已提交(Read Commited)這個隔離級別下主從復(fù)制是有bug的,因此Mysql將可重復(fù)讀(Repeatable Read)作為默認(rèn)的隔離級別!接下來,就要說說當(dāng)binlog為STATEMENT格式,且隔離級別為讀已提交(Read Commited)時,有什么bug呢?如下圖所示,在主(master)上執(zhí)行如下事務(wù)

mysql在項目中怎么選事務(wù)隔離級別

此時在主(master)上執(zhí)行下列語句

select * from test;

輸出如下

+---+| b |+---+| 3 |+---+1 row in set

但是,你在此時在從(slave)上執(zhí)行該語句,得出輸出如下

Empty set

這樣,你就出現(xiàn)了主從不一致性的問題!原因其實很簡單,就是在master上執(zhí)行的順序為先刪后插!而此時binlog為STATEMENT格式,它記錄的順序為先插后刪!從(slave)同步的是binglog,因此從機執(zhí)行的順序和主機不一致!就會出現(xiàn)主從

不一致!

如何解決?

解決方案有兩種!(1)隔離級別設(shè)為可重復(fù)讀(Repeatable Read),在該隔離級別下引入間隙鎖。當(dāng)Session 1執(zhí)行delete語句時,會鎖住間隙。那么,Ssession 2執(zhí)行插入語句就會阻塞住!(2)將binglog的格式修改為row格式,此時是基于行的復(fù)制,自然就不會出現(xiàn)sql執(zhí)行順序不一樣的問題!奈何這個格式在mysql5.1版本開始才引入。因此由于歷史原因,mysql將默認(rèn)的隔離級別設(shè)為可重復(fù)讀(Repeatable Read),保證主從復(fù)制不出問題!

那么,當(dāng)我們了解完mysql選可重復(fù)讀(Repeatable Read)作為默認(rèn)隔離級別的原因后,接下來我們將其和讀已提交(Read Commited)進(jìn)行對比,來說明為什么在互聯(lián)網(wǎng)項目為什么將隔離級別設(shè)為讀已提交(Read Commited)!

對比

ok,我們先明白一點!項目中是不用讀未提交(Read UnCommitted)和串行化(Serializable)兩個隔離級別,原因有二

采用讀未提交(Read UnCommitted),一個事務(wù)讀到另一個事務(wù)未提交讀數(shù)據(jù),這個不用多說吧,從邏輯上都說不過去! 采用串行化(Serializable),每個次讀操作都會加鎖,快照讀失效,一般是使用mysql自帶分布式事務(wù)功能時才使用該隔離級別!(筆者從未用過mysql自帶的這個功能,因為這是XA事務(wù),是強一致性事務(wù),性能不佳!互聯(lián)網(wǎng)的分布式方案,多采用最終一致性的事務(wù)解決方案!)

也就是說,我們該糾結(jié)都只有一個問題,究竟隔離級別是用讀已經(jīng)提交呢還是可重復(fù)讀?接下來對這兩種級別進(jìn)行對比,講講我們?yōu)槭裁催x讀已提交(Read Commited)作為事務(wù)隔離級別!假設(shè)表結(jié)構(gòu)如下

CREATE TABLE `test` (`id` int(11) NOT NULL,`color` varchar(20) NOT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB

數(shù)據(jù)如下

+----+-------+| id | color |+----+-------+| 1 | red || 2 | white || 5 | red || 7 | white |+----+-------+

為了便于描述,下面將

可重復(fù)讀(Repeatable Read),簡稱為RR; 讀已提交(Read Commited),簡稱為RC;

緣由一:在RR隔離級別下,存在間隙鎖,導(dǎo)致出現(xiàn)死鎖的幾率比RC大的多!此時執(zhí)行語句

select * from test where id <3 for update;

在RR隔離級別下,存在間隙鎖,可以鎖住(2,5)這個間隙,防止其他事務(wù)插入數(shù)據(jù)!而在RC隔離級別下,不存在間隙鎖,其他事務(wù)是可以插入數(shù)據(jù)!

ps:在RC隔離級別下并不是不會出現(xiàn)死鎖,只是出現(xiàn)幾率比RR低而已!

緣由二:在RR隔離級別下,條件列未命中索引會鎖表!而在RC隔離級別下,只鎖行此時執(zhí)行語句

update test set color = ’blue’ where color = ’white’;

在RC隔離級別下,其先走聚簇索引,進(jìn)行全部掃描。加鎖如下:

mysql在項目中怎么選事務(wù)隔離級別

但在實際中,MySQL做了優(yōu)化,在MySQL Server過濾條件,發(fā)現(xiàn)不滿足后,會調(diào)用unlock_row方法,把不滿足條件的記錄放鎖。

實際加鎖如下

mysql在項目中怎么選事務(wù)隔離級別

然而,在RR隔離級別下,走聚簇索引,進(jìn)行全部掃描,最后會將整個表鎖上,如下所示

mysql在項目中怎么選事務(wù)隔離級別

緣由三:在RC隔離級別下,半一致性讀(semi-consistent)特性增加了update操作的并發(fā)性!

在5.1.15的時候,innodb引入了一個概念叫做“semi-consistent”,減少了更新同一行記錄時的沖突,減少鎖等待。所謂半一致性讀就是,一個update語句,如果讀到一行已經(jīng)加鎖的記錄,此時InnoDB返回記錄最近提交的版本,由MySQL上層判斷此版本是否滿足update的where條件。若滿足(需要更新),則MySQL會重新發(fā)起一次讀操作,此時會讀取行的最新版本(并加鎖)!具體表現(xiàn)如下:此時有兩個Session,Session1和Session2!Session1執(zhí)行

update test set color = ’blue’ where color = ’red’;

先不Commit事務(wù)!與此同時Ssession2執(zhí)行

update test set color = ’blue’ where color = ’white’;

session 2嘗試加鎖的時候,發(fā)現(xiàn)行上已經(jīng)存在鎖,InnoDB會開啟semi-consistent read,返回最新的committed版本(1,red),(2,white),(5,red),(7,white)。MySQL會重新發(fā)起一次讀操作,此時會讀取行的最新版本(并加鎖)!而在RR隔離級別下,Session2只能等待!

兩個疑問

在RC級別下,不可重復(fù)讀問題需要解決么?不用解決,這個問題是可以接受的!畢竟你數(shù)據(jù)都已經(jīng)提交了,讀出來本身就沒有太大問題!Oracle的默認(rèn)隔離級別就是RC,你們改過Oracle的默認(rèn)隔離級別么?

在RC級別下,主從復(fù)制用什么binlog格式?OK,在該隔離級別下,用的binlog為row格式,是基于行的復(fù)制!Innodb的創(chuàng)始人也是建議binlog使用該格式!

總結(jié)

本文??鋨肅鋁艘黃?惱輪皇俏?慫得饕患?攏?チ??钅殼胗茫憾烈煙嶠?Read Commited)這個隔離級別!

到此這篇關(guān)于mysql在項目中怎么選事務(wù)隔離級別的文章就介紹到這了,更多相關(guān)mysql 事務(wù)隔離級別內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: MySQL 數(shù)據(jù)庫
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
精品中国亚洲| 蜜臀av一区二区在线免费观看| 久久男人av| 国产欧美一区二区色老头| 深夜福利亚洲| 亚洲综合电影一区二区三区| 夜夜嗨网站十八久久 | 亚洲2区在线| 蜜桃国内精品久久久久软件9| 国产精品一区免费在线| 国产精品久久久久久妇女| 首页亚洲欧美制服丝腿| 国产精品一级| 久久亚洲国产精品尤物| 蜜桃av一区二区| 精品久久网站| 色爱综合网欧美| 婷婷视频一区二区三区| 亚洲午夜久久| 久久香蕉网站| 国产精品1luya在线播放| 国语精品一区| 久久精品一区二区三区中文字幕| 日韩精选在线| 日韩中文字幕av电影| 亚洲丝袜啪啪| 欧美日本二区| 久久久久久网| 免费久久99精品国产自在现线| 国产农村妇女精品一二区| 精品一级视频| 国产日韩电影| 日韩一区二区三区精品| 久久亚洲道色| 久久久久久美女精品| 欧美a级一区二区| 九九99久久精品在免费线bt| 久久精品欧洲| 欧美激情麻豆| 精品国产亚洲一区二区三区在线| 激情综合婷婷| 国产成人精品福利| 亚洲aa在线| 久久国内精品| 欧美久久天堂| 激情婷婷亚洲| 亚洲综合小说| 国产精品日韩精品中文字幕| 久草精品视频| 欧美在线网站| 国产伦精品一区二区三区在线播放 | 国产人成精品一区二区三| 精品一区二区三区中文字幕 | 亚洲精品大片| 国产夫妻在线| 一区二区亚洲视频| 福利片在线一区二区| 伊人成人网在线看| 国产精品视频首页| 夜久久久久久| 精品视频在线观看网站| 最新亚洲一区| 国产精品nxnn| 亚洲综合日韩| 91偷拍一区二区三区精品| 视频一区二区欧美| 首页国产精品| 日本不卡高清| 日韩欧美少妇| 国产乱码精品一区二区亚洲| 欧美亚洲国产精品久久| 国产欧美日韩精品高清二区综合区| 99tv成人| 精品久久影院| 奇米777国产一区国产二区| 亚洲国产影院| 精品免费av| 婷婷亚洲精品| 日韩视频在线一区二区三区 | 99精品视频在线观看免费播放| 日韩高清一区二区| 免费精品国产| 久久三级毛片| 日本成人一区二区| 黄色免费成人| 欧美日韩尤物久久| 国产精品3区| 亚洲色图网站| 91精品国产福利在线观看麻豆| 国产精品久久久久久模特 | 久久精品播放| 国产成人精品999在线观看| 日韩不卡在线观看日韩不卡视频| 欧美va天堂在线| 97精品国产| 麻豆极品一区二区三区| 亚洲精品免费观看| 日韩午夜av| 99国产精品免费视频观看| 久久中文字幕一区二区| 日韩av一级片| 蜜桃视频在线观看一区二区| 成人啊v在线| 国产成人精品一区二区三区免费| 国产日产精品_国产精品毛片 | 午夜亚洲福利在线老司机| 日韩在线观看| 精品日产乱码久久久久久仙踪林| 国产日韩欧美| 国产日韩欧美一区二区三区在线观看| 涩涩涩久久久成人精品| 久久国产精品久久w女人spa| 亚洲性视频h| 特黄特色欧美大片| 日韩一区二区三区免费播放| 国产一区二区三区不卡av| 国产精品v亚洲精品v日韩精品| 久久精品 人人爱| 日韩三级一区| 日韩和欧美一区二区三区| 亚洲精品影院在线观看| 中文视频一区| 亚洲精品四区| 日本成人精品| 国产精品一区免费在线| 国产精品极品在线观看| 亚洲精品国产日韩| 日本在线成人| 国产精品亚洲成在人线| 国产精品一区二区美女视频免费看| 青青国产91久久久久久| 国产欧美一区二区三区精品观看 | 久久xxxx精品视频| 首页欧美精品中文字幕| 亚洲精品综合| 久久狠狠久久| 国产精品成人a在线观看| 国语精品一区| 日韩欧美一区二区三区免费看| 久久蜜桃精品| 欧美久久精品一级c片| 在线视频日韩| 日韩超碰人人爽人人做人人添| 国产精品免费大片| 国产精品蜜芽在线观看| 精品在线91| 亚洲精品大片| 精品久久国产一区| 91精品国产乱码久久久久久久 | 综合激情五月婷婷| 日韩1区2区日韩1区2区| 久久av资源| 秋霞影视一区二区三区| 91久久在线| 国产调教一区二区三区| 国产传媒在线| 妖精视频成人观看www| 奇米亚洲欧美| 深夜福利视频一区二区| 最新亚洲激情| 国产三级一区| 欧美sm一区| 久色成人在线| 国产精品极品在线观看| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 蜜臀va亚洲va欧美va天堂| 国产伦一区二区三区| 快播电影网址老女人久久| 蜜桃久久av一区| 久久国内精品自在自线400部| 国产精品99视频| 亚洲一区成人| 久久不卡国产精品一区二区| 久久在线视频免费观看| 亚洲精品伊人| 色婷婷色综合| 综合激情网...| 国产一区国产二区国产三区| 激情五月综合网| 久久国际精品| 欧美.日韩.国产.一区.二区 | 日韩三级一区| 日韩欧美午夜| 日韩激情综合| 国产99亚洲| 国产伦精品一区二区三区视频| 婷婷激情久久| 久久99偷拍| 99热免费精品| 高潮久久久久久久久久久久久久| 一本色道精品久久一区二区三区| 国产精品日韩精品在线播放| 国产高清久久| 久久这里只有| 综合激情网...| 日韩精品久久久久久久电影99爱| 少妇精品久久久一区二区三区| 日韩88av| 日韩专区视频网站| 久久久久免费av|