什麼是髒讀?
髒讀又稱無效資料的讀出,是指在資料庫存取中,事務T1將某一值修改,然後事務T2讀取該值,此後T1因為某種原因撤銷對該值的修改,這就導致了T2所讀取到的資料是無效的,值得注意的是,髒讀一般是針對於update操作的。
解決方法
mysql資料庫定義了四個隔離等級:
serializable:可避免髒讀、不可重複讀、虛讀情況的發生。
repeatable read:可以避免髒讀、無法重複讀取情況的發生。
read committed:可以避免髒讀狀況發生。
read uncommitted:最低級別,都會發生。
注意:交易的隔離等級收到資料庫的限制,不同的資料庫支援的隔離等級不一定相同
髒讀:修改時加排他鎖,直到事務提交後才釋放,讀取時加上共享鎖後(這樣在事務1讀取數據的過程中,其他事務就不會修改該數據),不允許任何事務操作該數據,只能讀取,之後1如果有更新操作,那麼會轉換為排他鎖,其他事務更無權參與進來讀寫,這樣就防止了髒讀問題
但是當事務1讀取資料過程中,有可能其他事務也讀取了該數據,讀取完畢後共享鎖釋放,此時事務1修改數據,修改完畢提交事務,其他事務再次讀取數據時候發現數據不一致,就會出現先不可重複讀取問題,所以這樣不能避免不可重複讀取問題
當執行不同的隔離等級時,可能會發生各種不同的問題。以下對他們進行總結並舉例說明:
臟讀取發生在一個事務A讀取了被另一個事務B修改,但是尚未提交的資料。假如B回退,則事務A讀取的是無效的資料。這跟不可重複讀取類似,但是第二個交易不需要執行提交。
以上是什麼是髒讀?的詳細內容。更多資訊請關注PHP中文網其他相關文章!