序言
臟讀执虹、不可重復(fù)讀捕透、幻讀這幾個(gè)概念開始接觸和學(xué)習(xí)的時(shí)候是在大學(xué)學(xué)習(xí)數(shù)據(jù)庫(kù)系統(tǒng)的時(shí)候,那時(shí)候?qū)@幾個(gè)專業(yè)名詞的理解停留在概念文字上撑瞧,并沒有真正使用過實(shí)踐中棵譬,最近工作中涉及到這幾個(gè)概念方面的知識(shí),就來整理一下预伺。
這幾個(gè)名詞涉及到的內(nèi)容有事務(wù)订咸、事務(wù)的隔離級(jí)別等
1. 臟讀
臟讀就是指當(dāng)一個(gè)事務(wù)A正在訪問數(shù)據(jù)曼尊,并且對(duì)數(shù)據(jù)進(jìn)行了修改,而這種修改還沒有提交到數(shù)據(jù)庫(kù)中脏嚷,這時(shí)骆撇,另外一個(gè)事務(wù)B也訪問這個(gè)數(shù)據(jù),然后使用了這個(gè)數(shù)據(jù)然眼,這就是臟讀艾船。
例子:
1.庫(kù)存的原有資產(chǎn)數(shù)量為1000, 倉(cāng)庫(kù)管理人員將庫(kù)存數(shù)量改為了8000(但未提交事務(wù))
2.盤點(diǎn)員盤點(diǎn)倉(cāng)庫(kù)資產(chǎn)數(shù)量 ,發(fā)現(xiàn)變?yōu)榱?000葵腹,歡天喜地高每!
3.而倉(cāng)庫(kù)管理員發(fā)現(xiàn)操作有誤,回滾了事務(wù), 資產(chǎn)數(shù)量又變?yōu)橘Y產(chǎn)數(shù)量了1000 像這樣, 盤點(diǎn)員記取的資產(chǎn)數(shù)量8000是一個(gè)臟數(shù)據(jù)践宴。
2. 不可重復(fù)讀
不可重復(fù)讀指在一個(gè)事務(wù)內(nèi)鲸匿,多次讀同一數(shù)據(jù)。在這個(gè)事務(wù)還沒有結(jié)束時(shí)阻肩,另外一個(gè)事務(wù)也訪問該同一數(shù)據(jù)带欢。那么,在第一個(gè)事務(wù)中的兩次讀數(shù)據(jù)之間烤惊,由于第二個(gè)事務(wù)的修改乔煞,那么第一個(gè)事務(wù)兩次讀到的的數(shù)據(jù)可能是不一樣的。這樣在一個(gè)事務(wù)內(nèi)兩次讀到的數(shù)據(jù)是不一樣的柒室,因此稱為是不可重復(fù)讀渡贾。
例子:
1.在事務(wù)1中,盤點(diǎn)員 讀取了資產(chǎn)數(shù)量為1000,操作并沒有完成
2.在事務(wù)2中雄右,這時(shí)倉(cāng)庫(kù)管理員修改了資產(chǎn)數(shù)量為2000,并提交了事務(wù).
3.在事務(wù)1中空骚,盤點(diǎn)員 再次讀取資產(chǎn)數(shù)量時(shí),資產(chǎn)數(shù)量變?yōu)榱?000
解決辦法:如果只有在修改事務(wù)完全提交之后才可以讀取數(shù)據(jù)擂仍,則可以避免該問題囤屹。
3. 幻讀
幻讀是指當(dāng)事務(wù)不是獨(dú)立執(zhí)行時(shí)發(fā)生的一種現(xiàn)象,例如第一個(gè)事務(wù)對(duì)一個(gè)表中的數(shù)據(jù)進(jìn)行了修改逢渔,這種修改涉及到表中的全部數(shù)據(jù)行肋坚。 同時(shí),第二個(gè)事務(wù)也修改這個(gè)表中的數(shù)據(jù)肃廓,這種修改是向表中插入一行新數(shù)據(jù)智厌。那么,以后就會(huì)發(fā)生操作第一個(gè)事務(wù)的用戶發(fā)現(xiàn)表中還有沒有修改的數(shù)據(jù)行亿昏,就好象 發(fā)生了幻覺一樣峦剔。例如,一個(gè)編輯人員更改作者提交的文檔角钩,但當(dāng)生產(chǎn)部門將其更改內(nèi)容合并到該文檔的主復(fù)本時(shí)吝沫,發(fā)現(xiàn)作者已將未編輯的新材料添加到該文檔中呻澜。
解決辦法:如果在編輯人員和生產(chǎn)部門完成對(duì)原始文檔的處理之前,任何人都不能將新材料添加到文檔中惨险,則可以避免該問題羹幸。
注意
不可重復(fù)讀的重點(diǎn)是修改 :
同樣的條件, 你讀取過的數(shù)據(jù),再次讀取出來發(fā)現(xiàn)值不一樣了
幻讀的重點(diǎn)在于新增或者刪除
同樣的條件, 第 1 次和第 2 次讀出來的記錄數(shù)不一樣
數(shù)據(jù)庫(kù)的隔離級(jí)別:
數(shù)據(jù)庫(kù)提供了四種事務(wù)隔離級(jí)別:由低到高分別是Read Uncommitted、Read Committed辫愉、Repeatable Read栅受、Serializable。
大多數(shù)數(shù)據(jù)庫(kù)的默認(rèn)隔離級(jí)別為: Read Commited,如Sql Server , Oracle.
少數(shù)數(shù)據(jù)庫(kù)默認(rèn)的隔離級(jí)別為Repeatable Read, 如MySQL InnoDB存儲(chǔ)引擎
解決臟讀恭朗、不可重復(fù)讀屏镊、幻讀可使用事務(wù)的隔離級(jí)別實(shí)現(xiàn),如下圖
READ_COMMITTED 會(huì)出現(xiàn)不可重復(fù)讀痰腮、幻讀問題(鎖定正在讀取的行)
REPEATABLE_READ 會(huì)出幻讀(鎖定所讀取的所有行)
SERIALIZABLE 保證所有的情況不會(huì)發(fā)生(鎖表)
本文參考
https://uule.iteye.com/blog/1109647
https://www.cnblogs.com/phoebus0501/archive/2011/02/28/1966709.html