數(shù)據(jù)庫(kù)如何防止臟讀 數(shù)據(jù)庫(kù)哪個(gè)隔離級(jí)別可以實(shí)現(xiàn)臟讀?
數(shù)據(jù)庫(kù)哪個(gè)隔離級(jí)別可以實(shí)現(xiàn)臟讀?對(duì)于同時(shí)運(yùn)行的多個(gè)事務(wù),當(dāng)這些事務(wù)訪問(wèn)數(shù)據(jù)庫(kù)中的同一數(shù)據(jù)時(shí),如果不采用必要的隔離機(jī)制,將導(dǎo)致各種并發(fā)問(wèn)題:·臟讀:對(duì)于兩件事T1,T2,T1讀取T2已更新但尚未提交的字
數(shù)據(jù)庫(kù)哪個(gè)隔離級(jí)別可以實(shí)現(xiàn)臟讀?
對(duì)于同時(shí)運(yùn)行的多個(gè)事務(wù),當(dāng)這些事務(wù)訪問(wèn)數(shù)據(jù)庫(kù)中的同一數(shù)據(jù)時(shí),如果不采用必要的隔離機(jī)制,將導(dǎo)致各種并發(fā)問(wèn)題:·臟讀:對(duì)于兩件事T1,T2,T1讀取T2已更新但尚未提交的字段。之后,如果T2回滾,則T1讀取的內(nèi)容是臨時(shí)的、無(wú)效的、不可重復(fù)的讀取:對(duì)于兩件事,T1,T2,T1讀取一個(gè)字段,然后T2更新該字段。之后,T1再次讀取相同的字段,并且值不同?!つёx:有兩件事,T1,T2,T1從表中讀取一個(gè)字段,T2在表中插入一些新行數(shù)據(jù)庫(kù)事務(wù)的隔離:數(shù)據(jù)庫(kù)系統(tǒng)必須具有隔離和運(yùn)行各種并發(fā)事務(wù)的能力,這樣它們就不會(huì)相互影響,避免了各種并發(fā)問(wèn)題。事務(wù)與其他事務(wù)之間的隔離程度稱(chēng)為隔離級(jí)別,不同的隔離級(jí)別對(duì)應(yīng)不同的干擾級(jí)別。隔離級(jí)別越高,數(shù)據(jù)一致性越好。但是,并發(fā)性越弱。數(shù)據(jù)庫(kù)提供四個(gè)隔離級(jí)別:readuncommitted(readuncommitted data)允許事務(wù)讀取其他事務(wù)未提交的更改。臟讀、不可重復(fù)讀和不真實(shí)讀問(wèn)題都發(fā)生在已提交的讀?。ㄒ烟峤坏淖x取數(shù)據(jù))中,只允許事務(wù)讀取其他事務(wù)已提交的更改,這樣可以避免臟讀。但是,由于不可重復(fù)讀取和不真實(shí)讀取,仍會(huì)發(fā)生可重復(fù)讀取??梢员苊鈴目尚蛄谢聞?wù)中重復(fù)讀取同一字段的問(wèn)題確保事務(wù)可以從表中讀取同一行。在此事務(wù)期間,禁止其他事務(wù)插入、更新和刪除該表。所有并發(fā)問(wèn)題都可以避免,但性能非常低。Oracle支持兩個(gè)事務(wù)隔離級(jí)別:read-committed、serializable。Oracle的默認(rèn)事務(wù)隔離級(jí)別是read committed,MySQL支持4 MySQL的默認(rèn)事務(wù)隔離級(jí)別是:repeatable read
下面簡(jiǎn)要解釋一下原因:
鎖定是因?yàn)椴僮鞑皇窃拥?。我?lái)解釋一下。參見(jiàn)下面兩個(gè)圖。
我這個(gè)操作需要
看上面的第二個(gè)圖,你能很清楚地理解這個(gè)過(guò)程嗎?
鎖定是為了確保上述三個(gè)步驟是原子操作。
回到問(wèn)題上來(lái),只有一個(gè)線程要寫(xiě),沒(méi)有競(jìng)爭(zhēng),所以不需要鎖定。
但是,如果你看第一張圖片,因?yàn)橹鲀?nèi)存和本地內(nèi)存的存在
在一個(gè)線程寫(xiě)入后,其他線程無(wú)法立即看到它。這就是可見(jiàn)性問(wèn)題。
添加volatile關(guān)鍵字后,它將在操作后強(qiáng)制工作內(nèi)存和主內(nèi)存同步,以確保其他線程可以立即看到它。
多個(gè)線程可以讀一個(gè)變量,只有一個(gè)線程可以對(duì)這個(gè)變量進(jìn)行寫(xiě),到底要不要加鎖?
臟讀是指事務(wù)正在訪問(wèn)數(shù)據(jù)并對(duì)其進(jìn)行修改。虛讀是一種在事務(wù)沒(méi)有獨(dú)立執(zhí)行時(shí)發(fā)生的現(xiàn)象。