數(shù)據(jù)庫如何防止臟讀 數(shù)據(jù)庫哪個隔離級別可以實現(xiàn)臟讀?
數(shù)據(jù)庫哪個隔離級別可以實現(xiàn)臟讀?對于同時運行的多個事務,當這些事務訪問數(shù)據(jù)庫中的同一數(shù)據(jù)時,如果不采用必要的隔離機制,將導致各種并發(fā)問題:·臟讀:對于兩件事T1,T2,T1讀取T2已更新但尚未提交的字
數(shù)據(jù)庫哪個隔離級別可以實現(xiàn)臟讀?
對于同時運行的多個事務,當這些事務訪問數(shù)據(jù)庫中的同一數(shù)據(jù)時,如果不采用必要的隔離機制,將導致各種并發(fā)問題:·臟讀:對于兩件事T1,T2,T1讀取T2已更新但尚未提交的字段。之后,如果T2回滾,則T1讀取的內(nèi)容是臨時的、無效的、不可重復的讀?。簩τ趦杉?,T1,T2,T1讀取一個字段,然后T2更新該字段。之后,T1再次讀取相同的字段,并且值不同。·魔讀:有兩件事,T1,T2,T1從表中讀取一個字段,T2在表中插入一些新行數(shù)據(jù)庫事務的隔離:數(shù)據(jù)庫系統(tǒng)必須具有隔離和運行各種并發(fā)事務的能力,這樣它們就不會相互影響,避免了各種并發(fā)問題。事務與其他事務之間的隔離程度稱為隔離級別,不同的隔離級別對應不同的干擾級別。隔離級別越高,數(shù)據(jù)一致性越好。但是,并發(fā)性越弱。數(shù)據(jù)庫提供四個隔離級別:readuncommitted(readuncommitted data)允許事務讀取其他事務未提交的更改。臟讀、不可重復讀和不真實讀問題都發(fā)生在已提交的讀?。ㄒ烟峤坏淖x取數(shù)據(jù))中,只允許事務讀取其他事務已提交的更改,這樣可以避免臟讀。但是,由于不可重復讀取和不真實讀取,仍會發(fā)生可重復讀取,這確保事務可以多次從字段中讀取相同的值。在事務期間,禁止其他事務更新字段,以避免臟讀和不可重復讀。但是,不真實讀取的問題仍然存在,這可以確保事務可以從表中讀取同一行。在此事務期間,禁止其他事務插入、更新和刪除該表。所有并發(fā)問題都可以避免,但性能非常低。Oracle支持兩個事務隔離級別:read-committed、serializable。Oracle的默認事務隔離級別是read committed,MySQL支持4,MySQL的默認事務隔離級別是:repeatable read
mvcc現(xiàn)在在主流數(shù)據(jù)庫中使用。使用RR隔離級別后,將不會出現(xiàn)虛讀。
根據(jù)不同的材料,RR是199X的ANSI SQL標準,但真正的數(shù)據(jù)庫不一定符合標準(事實上,最好沒有虛讀)。