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

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

mysql在項目中怎么選事務隔離級別

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

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

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

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

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

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

正文

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

Why?Why?Why?

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

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

binlog有幾種格式?

OK,三種,分別是

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

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

mysql在項目中怎么選事務隔離級別

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

select * from test;

輸出如下

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

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

Empty set

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

不一致!

如何解決?

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

那么,當我們了解完mysql選可重復讀(Repeatable Read)作為默認隔離級別的原因后,接下來我們將其和讀已提交(Read Commited)進行對比,來說明為什么在互聯網項目為什么將隔離級別設為讀已提交(Read Commited)!

對比

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

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

也就是說,我們該糾結都只有一個問題,究竟隔離級別是用讀已經提交呢還是可重復讀?接下來對這兩種級別進行對比,講講我們為什么選讀已提交(Read Commited)作為事務隔離級別!假設表結構如下

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

數據如下

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

為了便于描述,下面將

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

緣由一:在RR隔離級別下,存在間隙鎖,導致出現死鎖的幾率比RC大的多!此時執行語句

select * from test where id <3 for update;

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

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

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

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

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

mysql在項目中怎么選事務隔離級別

但在實際中,MySQL做了優化,在MySQL Server過濾條件,發現不滿足后,會調用unlock_row方法,把不滿足條件的記錄放鎖。

實際加鎖如下

mysql在項目中怎么選事務隔離級別

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

mysql在項目中怎么選事務隔離級別

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

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

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

先不Commit事務!與此同時Ssession2執行

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

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

兩個疑問

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

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

總結

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

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

標簽: MySQL 數據庫
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
青青伊人久久| 日本成人精品| 亚洲精品网址| 日本不卡视频在线观看| 欧美三区不卡| 国产精品一区二区精品视频观看| 国产在视频一区二区三区吞精| 国产精品一线天粉嫩av| 成人亚洲欧美| 亚洲一区二区三区高清| 成人国产精品久久| 国产探花一区在线观看| 91精品亚洲| 美女久久一区| 国产麻豆久久| 久久精品 人人爱| 99在线精品免费视频九九视| 日本不卡一二三区黄网| 婷婷亚洲综合| 日韩中文欧美| 红桃视频欧美| 91日韩免费| 欧美日本二区| 久久香蕉国产| 亚洲黑丝一区二区| 国产精品最新自拍| 日韩大片在线观看| 亚洲综合中文| 亚洲精品**中文毛片| 亚洲乱码一区| 四虎国产精品免费久久| 亚洲激情偷拍| 婷婷亚洲五月| 亚洲精一区二区三区| 午夜欧美精品久久久久久久| 日韩国产欧美一区二区| 国产麻豆一区二区三区精品视频| 在线视频免费在线观看一区二区| 亚洲精品第一| 日韩高清中文字幕一区二区| 久久久久观看| 国产精品4hu.www| 99在线|亚洲一区二区| 欧美aa国产视频| 亚洲成人精品| 久久久久久久久丰满| 久久久久国产一区二区| 日韩av首页| 香蕉成人久久| 日韩高清成人| 亚久久调教视频| 婷婷精品在线观看| 国产精品xxx| 日本一区二区中文字幕| 日韩av一级| 久久亚洲精品中文字幕| 亚洲日韩视频| 亚洲天堂免费| 免费看欧美美女黄的网站| 国产在线观看www| 国际精品欧美精品| 精品中文字幕一区二区三区四区| 日韩av中文字幕一区| 91精品丝袜国产高跟在线| 国产aa精品| 久久影院一区| 97视频热人人精品免费| 日韩中文一区二区| 亚洲女同一区| 亚洲欧洲av| 97久久精品| 国产亚洲一区在线| 国产在线观看www| 国产麻豆精品久久| 久久精品国产68国产精品亚洲| 国际精品欧美精品| 美女福利一区二区三区| 午夜电影一区| 香蕉久久99| 精品九九久久| 综合干狼人综合首页| 久久久精品久久久久久96| 国产综合婷婷| 欧美91精品| 老鸭窝亚洲一区二区三区| 鲁大师成人一区二区三区| 久久国产成人午夜av影院宅| 欧美日韩伊人| 激情综合网五月| 欧美视频一区| 99国产精品自拍| 都市激情国产精品| 欧美日韩国产一区二区在线观看| 天堂精品久久久久| 日韩精品午夜视频| 国产日韩视频| 美女在线视频一区| 久久久久久黄| 国产欧美日韩亚洲一区二区三区| 亚洲aa在线| 亚洲视频电影在线| 综合日韩在线| 国产精品白丝一区二区三区| 久久久久久网| 国产一区亚洲| 日韩免费福利视频| 麻豆视频在线看| 午夜天堂精品久久久久| 欧美不卡在线| 国产美女高潮在线| 国产麻豆一区二区三区| 久久成人av| 精品女同一区二区三区在线观看| 国产精品腿扒开做爽爽爽挤奶网站| 亚洲1234区| 久久蜜桃资源一区二区老牛| 高清不卡亚洲| 99成人在线| 国产精品一区二区中文字幕| 狂野欧美性猛交xxxx| 国产精品99免费看| 国产日韩欧美| 蜜芽一区二区三区| 久久爱www成人| 麻豆精品视频在线观看免费| 精品国产精品久久一区免费式| 国产精品久久观看| 黄色欧美日韩| 久久精品网址| 亚洲精品综合| 亚洲大片在线| 在线亚洲成人| 国产精品美女午夜爽爽| 欧美成人综合| 日韩视频一二区| 免费毛片在线不卡| 午夜精品福利影院| 日韩国产在线| 国产毛片精品| 日本亚洲最大的色成网站www | 亚洲九九精品| 国产精品普通话对白| 欧美日本久久| 99久久夜色精品国产亚洲1000部| 亚洲在线免费| 亚洲精品一区二区在线播放∴| 欧美精品高清| 日本久久精品| 久久精品影视| 国产精品亚洲片在线播放| 免费人成网站在线观看欧美高清| 欧美sss在线视频| 高潮一区二区| 欧美美女一区| 亚洲精华国产欧美| 美女福利一区二区三区| 久久99精品久久久久久园产越南 | 国产精品激情电影| 91嫩草精品| 精品国产精品久久一区免费式| 成人国产精选| 影音国产精品| 中文字幕亚洲精品乱码| 国产亚洲一区二区三区不卡| 亚洲毛片一区| 中文国产一区| 日韩视频二区| 日韩av黄色在线| 国产精品第十页| 肉色欧美久久久久久久免费看| 蜜臀av一区二区三区| 亚洲国内欧美| 97视频热人人精品免费| 欧美aa在线观看| 国产精品av久久久久久麻豆网| 免费视频一区三区| 91九色综合| 视频一区中文字幕精品| 日韩1区2区日韩1区2区| 国产精区一区二区| 亚洲精品成人图区| 婷婷综合激情| 国产极品模特精品一二| 日韩精品水蜜桃| 欧美精品一二| 国产欧美精品久久| 久久高清精品| 午夜在线精品偷拍| 国产精品99精品一区二区三区∴ | 欧美性感美女一区二区| 亚洲精品一级二级三级| 国产精品一区二区三区www| 国产日韩高清一区二区三区在线| 国产毛片一区二区三区| 狠狠久久伊人中文字幕| 免费国产自久久久久三四区久久| 日韩国产在线不卡视频| 国产一二在线播放| 日韩一区二区三区在线看| 亚洲一区二区免费在线观看|