千鋒教育2023版Java面試寶典Java面試200題(含美團(tuán)、字節(jié)、阿里大廠真

怎么理解臟讀、不可重復(fù)讀和幻讀?
臟讀(Dirty Read)是指在數(shù)據(jù)庫(kù)事務(wù)中,一個(gè)事務(wù)讀取了另一個(gè)事務(wù)尚未提交的數(shù)據(jù)。換句話說(shuō),一個(gè)事務(wù)讀到了尚未完成的、臨時(shí)的、未提交的數(shù)據(jù)。如果另一個(gè)事務(wù)回滾了,那么讀取到的數(shù)據(jù)就是無(wú)效的或者錯(cuò)誤的。
不可重復(fù)讀(Non-repeatable Read)是指在數(shù)據(jù)庫(kù)事務(wù)中,一個(gè)事務(wù)內(nèi)兩次讀取同一數(shù)據(jù),但是兩次讀取的結(jié)果卻不一致。這可以發(fā)生在另一個(gè)事務(wù)修改了數(shù)據(jù)并提交之后,導(dǎo)致第一個(gè)事務(wù)的兩次讀取得到的結(jié)果不一樣。
幻讀(Phantom Read)是指在數(shù)據(jù)庫(kù)事務(wù)中,一個(gè)事務(wù)內(nèi)兩次執(zhí)行相同的查詢,但是查詢的結(jié)果卻不一致。這可以發(fā)生在另一個(gè)事務(wù)插入了新數(shù)據(jù)或者刪除了已有數(shù)據(jù)并提交之后,導(dǎo)致第一個(gè)事務(wù)的兩次查詢得到的結(jié)果不一樣。
這三個(gè)問(wèn)題都是并發(fā)控制中的問(wèn)題,可能會(huì)導(dǎo)致數(shù)據(jù)的不一致性。為了避免臟讀、不可重復(fù)讀和幻讀,可以使用鎖機(jī)制和事務(wù)隔離級(jí)別來(lái)控制并發(fā)操作。不同的數(shù)據(jù)庫(kù)管理系統(tǒng)提供了不同的隔離級(jí)別,比如讀未提交(Read Uncommitted)、讀已提交(Read Committed)、可重復(fù)讀(Repeatable Read)和序列化(Serializable),可以根據(jù)具體需求選擇合適的隔離級(jí)別來(lái)解決并發(fā)控制問(wèn)題。