mysql事務(wù)隔離

事務(wù)是什么

?? 事務(wù)比較常見(jiàn)數(shù)據(jù)庫(kù)操作抛猖,例如銀行金融業(yè)務(wù),涉及多個(gè)操作岭辣,并保證操作要么全部成功要么全部失敗吱晒,這樣保證數(shù)據(jù)的一致性。事務(wù)支持是在引擎層實(shí)現(xiàn)的易结,事務(wù)存在以下特性:原子性枕荞、一致性柜候、隔離性、持久性躏精;

  • 原子性:原子性是指事務(wù)包含的所有操作要么全部成功渣刷,要么全部失敗回滾
  • 一致性:一致性是指事務(wù)必須使數(shù)據(jù)庫(kù)從一個(gè)一致性狀態(tài)變換到另一個(gè)一致性狀態(tài),也就是說(shuō)一個(gè)事務(wù)執(zhí)行之前和執(zhí)行之后都必須處于一致性狀態(tài)
  • 隔離性:隔離性是當(dāng)多個(gè)用戶并發(fā)訪問(wèn)數(shù)據(jù)庫(kù)時(shí)矗烛,比如操作同一張表時(shí)辅柴,數(shù)據(jù)庫(kù)為每一個(gè)用戶開(kāi)啟的事務(wù),不能被其他事務(wù)的操作所干擾瞭吃,多個(gè)并發(fā)事務(wù)之間要相互隔離
  • 持久性:持久性是指一個(gè)事務(wù)一旦被提交了碌嘀,那么對(duì)數(shù)據(jù)庫(kù)中的數(shù)據(jù)的改變就是永久性的,即便是在數(shù)據(jù)庫(kù)系統(tǒng)遇到故障的情況下也不會(huì)丟失提交事務(wù)的操作
    當(dāng)數(shù)據(jù)庫(kù)上有多個(gè)事務(wù)同時(shí)執(zhí)行的時(shí)候歪架,就可能出現(xiàn)臟讀(dirty read)股冗、不可重復(fù)讀(non-repeatable read)、幻讀(phantom read)的問(wèn)題和蚪,接下來(lái)我們看下不同的事務(wù)隔離級(jí)別以及每種隔離級(jí)別的作用

事務(wù)隔離級(jí)別有哪些

讀未提交

Read uncommmited:讀未提交止状,顧名思義,就是一個(gè)事務(wù)可以讀取另一個(gè)未提交事務(wù)的數(shù)據(jù)攒霹。
● 事例:老板要給程序員發(fā)工資怯疤,程序員的工資是3.6萬(wàn)/月。但是發(fā)工資時(shí)老板不小心按錯(cuò)了數(shù)字催束,按成3.9萬(wàn)/月集峦,該錢已經(jīng)打到程序員的戶口,但是事務(wù)還沒(méi)有提交抠刺,就在這時(shí)塔淤,程序員去查看自己這個(gè)月的工資,發(fā)現(xiàn)比往常多了3千元矫付,以為漲工資了非常高興凯沪。但是老板及時(shí)發(fā)現(xiàn)了不對(duì),馬上回滾差點(diǎn)就提交了的事務(wù)买优,將數(shù)字改成3.6萬(wàn)再提交妨马。
● 分析:實(shí)際程序員這個(gè)月的工資還是3.6萬(wàn),但是程序員看到的是3.9萬(wàn)杀赢。他看到的是老板還沒(méi)提交事務(wù)時(shí)的數(shù)據(jù)烘跺。這就是臟讀。
● 問(wèn)題:這種事務(wù)隔離級(jí)別可導(dǎo)致臟讀脂崔,使用讀提交滤淳,能解決臟讀問(wèn)題。

讀已提交

Read committed:讀提交砌左,顧名思義脖咐,就是一個(gè)事務(wù)要等另一個(gè)事務(wù)提交后才能讀取數(shù)據(jù)
● 事例:程序員拿著信用卡去享受生活(卡里當(dāng)然是只有3.6萬(wàn))铺敌,當(dāng)他買單時(shí)(程序員事務(wù)開(kāi)啟),收費(fèi)系統(tǒng)事先檢測(cè)到他的卡里有3.6萬(wàn)屁擅,就在這個(gè)時(shí)候偿凭,程序員的妻子要把錢全部轉(zhuǎn)出充當(dāng)家用,并提交派歌。當(dāng)收費(fèi)系統(tǒng)準(zhǔn)備扣款時(shí)弯囊,再檢測(cè)卡里的金額,發(fā)現(xiàn)已經(jīng)沒(méi)錢了(第二次檢測(cè)金額當(dāng)然要等待妻子轉(zhuǎn)出金額事務(wù)提交完)胶果。程序員就會(huì)很郁悶匾嘱,明明卡里是有錢的…
● 分析:這就是讀提交,若有事務(wù)對(duì)數(shù)據(jù)進(jìn)行更新(UPDATE)操作時(shí)早抠,讀操作事務(wù)要等待這個(gè)更新操作事務(wù)提交后才能讀取數(shù)據(jù)霎烙,可以解決臟讀問(wèn)題。但在這個(gè)事例中贝或,出現(xiàn)了一個(gè)事務(wù)范圍內(nèi)兩個(gè)相同的查詢卻返回了不同數(shù)據(jù)吼过,這就是不可重復(fù)讀
● 問(wèn)題:這種隔離級(jí)別可導(dǎo)致不可重復(fù)讀;那怎么解決可能的不可重復(fù)讀問(wèn)題咪奖?Repeatable read

可重復(fù)讀

Repeatable read:重復(fù)讀,就是在開(kāi)始讀取數(shù)據(jù)(事務(wù)開(kāi)啟)時(shí)酱床,不再允許修改操作
● 事例:程序員拿著信用卡去享受生活(卡里當(dāng)然是只有3.6萬(wàn))羊赵,當(dāng)他買單時(shí)(事務(wù)開(kāi)啟,不允許其他事務(wù)的UPDATE修改操作)扇谣,收費(fèi)系統(tǒng)事先檢測(cè)到他的卡里有3.6萬(wàn)昧捷。這個(gè)時(shí)候他的妻子不能轉(zhuǎn)出金額了。接下來(lái)收費(fèi)系統(tǒng)就可以扣款了罐寨。
● 分析:可重復(fù)讀隔離級(jí)別可以解決不可重復(fù)讀問(wèn)題靡挥。寫到這里,應(yīng)該明白的一點(diǎn)就是鸯绿,不可重復(fù)讀對(duì)應(yīng)的是修改跋破,即UPDATE操作。但是可能還會(huì)有幻讀問(wèn)題瓶蝴。因?yàn)榛米x問(wèn)題對(duì)應(yīng)的是插入INSERT操作毒返,而不是UPDATE操作。
● 問(wèn)題:導(dǎo)致幻讀問(wèn)題舷手;什么時(shí)候會(huì)出現(xiàn)幻讀拧簸?事例:程序員某一天去消費(fèi),花了2千元男窟,然后他的妻子去查看他今天的消費(fèi)記錄(全表掃描FTS盆赤,妻子事務(wù)開(kāi)啟)贾富,看到確實(shí)是花了2千元,就在這個(gè)時(shí)候牺六,程序員花了1萬(wàn)買了一部電腦祷安,即新增INSERT了一條消費(fèi)記錄,并提交兔乞。當(dāng)妻子打印程序員的消費(fèi)記錄清單時(shí)(妻子事務(wù)提交)汇鞭,發(fā)現(xiàn)花了1.2萬(wàn)元,似乎出現(xiàn)了幻覺(jué)庸追,這就是幻讀霍骄。

串行

Serializable 序列化:是最高的事務(wù)隔離級(jí)別,在該級(jí)別下淡溯,事務(wù)串行化順序執(zhí)行读整,可以避免臟讀、不可重復(fù)讀與幻讀咱娶∶准洌“寫”會(huì)加“寫鎖”,“讀”會(huì)加“讀鎖”膘侮,當(dāng)出現(xiàn)讀寫鎖沖突的時(shí)候屈糊,后訪問(wèn)的事務(wù)必須等前一個(gè)事務(wù)執(zhí)行完成,才能繼續(xù)執(zhí)行琼了,這種事務(wù)隔離級(jí)別效率低下逻锐,比較耗數(shù)據(jù)庫(kù)性能,一般不使用

【注意】大多數(shù)數(shù)據(jù)庫(kù)默認(rèn)的事務(wù)隔離級(jí)別是Read committed雕薪,比如Sql Server , Oracle昧诱。Mysql的默認(rèn)隔離級(jí)別是Repeatable read

事務(wù)隔離之可重復(fù)讀如何實(shí)現(xiàn)

??這里主要說(shuō)下可重復(fù)讀的實(shí)現(xiàn),首先可重復(fù)讀是利用undo log來(lái)記錄所袁,不同時(shí)刻啟動(dòng)的事務(wù)會(huì)有不同的 read-view盏档,Undo log是InnoDB MVCC事務(wù)特性的重要組成部分。當(dāng)我們對(duì)記錄做了變更操作時(shí)就會(huì)產(chǎn)生undo記錄燥爷,Undo記錄默認(rèn)被記錄到系統(tǒng)表空間(ibdata)中蜈亩,但從5.6開(kāi)始,也可以使用獨(dú)立的Undo 表空間局劲。
案例分析:事務(wù) A 第一次讀完之后勺拣,事務(wù) B 要修改這行數(shù)據(jù)了。undo log 會(huì)為所有寫操作生成日志鱼填,所以就會(huì)生成一條 undo log 日志药有,并且它的 roll_pointer 會(huì)指向上一條 undo log 日志。


image

緊接著,事務(wù) A 第二次去讀這行數(shù)據(jù)了愤惰,情況如下圖所示:


image

第一次讀的時(shí)候苇经,開(kāi)啟事務(wù) A 的時(shí)候就生成了一個(gè) ReadView-R,此時(shí)事務(wù) A 第二次去查詢的時(shí)候宦言,先查到的是 trx_id = 18 的那條數(shù)據(jù)扇单,它會(huì)發(fā)現(xiàn) 18 比最小的事務(wù)編號(hào) 10 大。那就說(shuō)明事務(wù)編號(hào)為 18 的事務(wù)奠旺,有可能它是讀不到的蜘澜。
接著就要去 m_ids 里確認(rèn)是否有 18 這條數(shù)據(jù)了。發(fā)現(xiàn)有 18响疚,那就說(shuō)明在事務(wù) A 開(kāi)啟事務(wù)的時(shí)候鄙信,這個(gè)事務(wù)是沒(méi)有提交的,它修改的數(shù)據(jù)就不應(yīng)該被讀到忿晕。事務(wù) A 就會(huì)順著 roll_pointer 指針繼續(xù)往下找装诡,找到了 trx_id = 8 這條日志,發(fā)現(xiàn)這條能讀践盼,讀到的值任然是 x鸦采,與第一次讀到的結(jié)果一致。成功實(shí)現(xiàn)可重復(fù)讀咕幻!

常見(jiàn)問(wèn)題

1.可重復(fù)讀的使用場(chǎng)景舉例? 對(duì)賬的時(shí)候應(yīng)該很有用?
??對(duì)于已經(jīng)開(kāi)啟的事務(wù)渔伯,讀視圖已經(jīng)建立,這時(shí)對(duì)賬過(guò)程中出現(xiàn)更新不影響對(duì)賬谅河;

2.并發(fā)版本控制(MCVV)的概念是什么, 是怎么實(shí)現(xiàn)的?
??是通過(guò)保存數(shù)據(jù)在某個(gè)時(shí)間點(diǎn)的快照來(lái)實(shí)現(xiàn)并發(fā)控制的咱旱。也就是說(shuō),不管事務(wù)執(zhí)行多長(zhǎng)時(shí)間绷耍,事務(wù)內(nèi)部看到的數(shù)據(jù)是不受其它事務(wù)影響的,根據(jù)事務(wù)開(kāi)始的時(shí)間不同鲜侥,每個(gè)事務(wù)對(duì)同一張表褂始,同一時(shí)刻看到的數(shù)據(jù)可能是不一樣的;
可以認(rèn)為 多版本并發(fā)控制(MVCC) 是行級(jí)鎖的一個(gè)變種,但是它在很多情況下避免了加鎖操作描函,因此開(kāi)銷更低崎苗。雖然實(shí)現(xiàn)機(jī)制有所不同,但大都實(shí)現(xiàn)了非阻塞的讀操作舀寓,寫操作也只鎖定必要的行;

3.使用長(zhǎng)事務(wù)的弊病? 為什么使用常事務(wù)可能拖垮整個(gè)庫(kù)?
??長(zhǎng)事務(wù)意味著系統(tǒng)里面會(huì)存在很老的事務(wù)視圖胆数,由于這些事務(wù)隨時(shí)可能訪問(wèn)數(shù)據(jù)庫(kù)里面的任何數(shù)據(jù),所以這個(gè)事務(wù)提交之前互墓,數(shù)據(jù)庫(kù)里面它可能用到的回滾記錄都必須保留必尼,這就導(dǎo)致了大量占用內(nèi)存。在MySQL5.5以前的版本,回滾日志是和數(shù)據(jù)字典一起放在ibdata文件里的判莉,即使長(zhǎng)事務(wù)提交豆挽,回滾段被清理,文件也不會(huì)變小券盅,最終往往為了清理回滾段而重建整個(gè)庫(kù)帮哈。除了影響回滾段,長(zhǎng)事務(wù)還會(huì)占用鎖資源锰镀,也有可能拖垮整個(gè)庫(kù)娘侍。

4.commit work and chain的語(yǔ)法是做什么用的?
??提交當(dāng)前事務(wù),并開(kāi)始下一個(gè)事務(wù)

5.怎么查詢各個(gè)表中的長(zhǎng)事務(wù)?
select * from information_schema.innodb_trx where TIME_TO_SEC(timediff(now(),trx_started))>60;

7.如何避免長(zhǎng)事務(wù)的出現(xiàn)?
在一個(gè)事務(wù)里面泳炉, 避免一次處理太多數(shù)據(jù)
在一個(gè)事務(wù)里面憾筏,盡量避免不必要的查詢
在一個(gè)事務(wù)里面, 避免耗時(shí)太多的操作胡桃,造成事務(wù)超時(shí)踩叭。一些非DB的操作,比如rpc調(diào)用翠胰,消息隊(duì)列的操作盡量放到事務(wù)之外操作

參考文獻(xiàn)

https://www.cnblogs.com/cnbk/p/13043872.html
http://mysql.taobao.org/monthly/2015/04/01/
https://time.geekbang.org/column/article/68963
https://blog.csdn.net/itworld123/article/details/115207304
https://segmentfault.com/a/1190000037557620
https://www.cnblogs.com/trunks2008/p/15213918.html
https://segmentfault.com/a/1190000037557620
https://segmentfault.com/a/1190000023273980

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末容贝,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子之景,更是在濱河造成了極大的恐慌斤富,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡椿息,警方通過(guò)查閱死者的電腦和手機(jī)侨把,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)悯舟,“玉大人,你說(shuō)我怎么就攤上這事×仕唬” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵崇众,是天一觀的道長(zhǎng)掂僵。 經(jīng)常有香客問(wèn)我,道長(zhǎng)顷歌,這世上最難降的妖魔是什么锰蓬? 我笑而不...
    開(kāi)封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮眯漩,結(jié)果婚禮上芹扭,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好冯勉,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布澈蚌。 她就那樣靜靜地躺著,像睡著了一般灼狰。 火紅的嫁衣襯著肌膚如雪宛瞄。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天交胚,我揣著相機(jī)與錄音份汗,去河邊找鬼。 笑死蝴簇,一個(gè)胖子當(dāng)著我的面吹牛杯活,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播熬词,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼旁钧,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了互拾?” 一聲冷哼從身側(cè)響起歪今,我...
    開(kāi)封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎颜矿,沒(méi)想到半個(gè)月后寄猩,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡骑疆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年田篇,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片箍铭。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡泊柬,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出诈火,到底是詐尸還是另有隱情彬呻,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布柄瑰,位于F島的核電站,受9級(jí)特大地震影響剪况,放射性物質(zhì)發(fā)生泄漏教沾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一译断、第九天 我趴在偏房一處隱蔽的房頂上張望授翻。 院中可真熱鬧,春花似錦、人聲如沸堪唐。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)淮菠。三九已至男公,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間合陵,已是汗流浹背枢赔。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拥知,地道東北人踏拜。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像低剔,于是被迫代替她去往敵國(guó)和親速梗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容