臟讀
數(shù)據(jù)庫隔離級(jí)別為讀未提交的時(shí)候,可能發(fā)生臟讀。讀未提交指當(dāng)會(huì)話A的數(shù)據(jù)庫操作尚未commit時(shí)望薄,會(huì)話B可以讀取到這個(gè)未提交的數(shù)據(jù)。而此時(shí)如果會(huì)話A因?yàn)槟承┰騬ollback了呼畸,那么會(huì)話B讀取的數(shù)據(jù)就是錯(cuò)誤的痕支,也就是臟讀。當(dāng)隔離級(jí)別提高到讀已提交時(shí)蛮原,則可以避免臟讀卧须。
不可重復(fù)讀
簡單的理解就是多次讀取結(jié)果不一致,在會(huì)話A中多次相同的操作讀取的數(shù)據(jù)是不一致的儒陨。比如花嘶,在會(huì)話A的兩次讀取操作直接,會(huì)話B對(duì)此數(shù)據(jù)進(jìn)行了提交蹦漠,那么會(huì)話A第一次讀取的是之前的數(shù)據(jù)椭员,第二次讀取的是之后的數(shù)據(jù)。通過隔離級(jí)別可重復(fù)讀來解決這個(gè)問題笛园。
幻讀
不可重復(fù)讀的特殊場(chǎng)景隘击,不可重復(fù)讀主要是指在讀取某條記錄時(shí)發(fā)生,而幻讀指的是范圍研铆。比如埋同,會(huì)話A第一查詢年齡大于18的人,發(fā)現(xiàn)沒有數(shù)據(jù)棵红,但當(dāng)?shù)诙芜M(jìn)行查詢時(shí)凶赁,卻查詢到了數(shù)據(jù)。在串行化的隔離級(jí)別下窄赋,不會(huì)發(fā)生幻讀哟冬。
數(shù)據(jù)庫鎖
- 排它鎖
又稱為X 鎖,寫鎖忆绰。一個(gè)事務(wù)對(duì)數(shù)據(jù)對(duì)象 O 加了 排他鎖浩峡,就可以對(duì) O 進(jìn)行讀取和更新。加鎖期間其它事務(wù)不能對(duì) O 加任何鎖错敢。
- 共享鎖
又稱為S 鎖翰灾,讀鎖缕粹。一個(gè)事務(wù)對(duì)數(shù)據(jù)對(duì)象O加了共享鎖,可以對(duì)O進(jìn)行讀取操作纸淮,但是不能進(jìn)行更新操作平斩。加鎖期間其它事務(wù)能對(duì)O 加 共享鎖,但是不能加排他鎖咽块。
隔離級(jí)別
- 讀未提交
如果一個(gè)事務(wù)已經(jīng)開始寫操作绘面,那么其他事務(wù)則不允許同時(shí)進(jìn)行寫操作,但允許其他事務(wù)讀此行數(shù)據(jù)侈沪。
- 寫操作不加鎖揭璃;
- 讀操作不加鎖;
- 讀已提交
讀取數(shù)據(jù)的事務(wù)允許其他事務(wù)繼續(xù)訪問該行數(shù)據(jù)亭罪,但是未提交的寫事務(wù)將會(huì)禁止其他事務(wù)訪問該行瘦馍。
- 寫操作加排他鎖,保持到事務(wù)結(jié)束应役;
- 讀操作加鎖共享鎖情组,此次查詢結(jié)束后立即釋放共享鎖,保證讀取的數(shù)據(jù)都是已提交的數(shù)據(jù)箩祥。
- 可重復(fù)讀
讀取數(shù)據(jù)的事務(wù)將會(huì)禁止寫事務(wù)(但允許讀事務(wù))院崇,寫事務(wù)則禁止任何其他事務(wù)。保證了在同一個(gè)事務(wù)中多次讀取同樣數(shù)據(jù)的結(jié)果是一樣的袍祖。
1.寫操作加排他鎖亚脆;
2.讀操作加共享鎖,保持到事務(wù)結(jié)束盲泛。不妨礙其他事務(wù)讀寂屏,但其它事務(wù)無法修改這些數(shù)據(jù)俊扭,無法鎖住insert的數(shù)據(jù)(造成幻讀);
3.InnoDB中,SELECT单寂、UPDATE菲茬、DELETE操作的不可重復(fù)讀問題可以通過MVCC(多版本并發(fā)控制)來解決坚弱,但是INSERT操作的幻讀問題需要通過MVCC + Next-Key Locks 來解決盛正。
- 串行化
極大的降低數(shù)據(jù)庫的并發(fā)能力。讀用讀鎖蚁孔,寫用寫鎖奶赔,讀鎖和寫鎖互斥
- 寫操作加排他鎖;
- 讀操作加排他鎖杠氢;
總結(jié)
- 在InnoDB引擎中站刑,對(duì)于索引的掃描,不僅鎖住掃描到的索引鼻百,而且還鎖住這些索引覆蓋的范圍绞旅,因此這個(gè)范圍是內(nèi)插入數(shù)據(jù)是不允許的摆尝。
- 使用select @@tx_isolation;查詢數(shù)據(jù)庫的隔離級(jí)別。
- 隔離級(jí)別越高(讀未提交->讀已提交->可重復(fù)讀->串行化)因悲,越能保證數(shù)據(jù)的完整性和一致性堕汞,對(duì)并發(fā)性能的影響也會(huì)越大。
- Mysql默認(rèn)的級(jí)別是可重復(fù)讀晃琳,優(yōu)先考慮把數(shù)據(jù)庫系統(tǒng)的隔離級(jí)別設(shè)為讀已提交讯检。
轉(zhuǎn)載鏈接:https://juejin.im/post/5e7c16ff6fb9a0095426c21a