數據庫髒讀,不可重複度,幻讀以及對應的事務隔離級別

1. 髒讀:

所謂髒讀,即“無效事務讀出”。也就是說,一個事務讀取到另一個事務沒有提交的數據。我們舉個例子:事務A1修改了一行數據,但是還沒有提交(還沒寫入硬盤),這時候事務A2讀取了被事務A1修改後的數據,之後事務T1因爲一些原因Rollback回滾了,那麼事務T2讀取的數據就是髒的。

那麼它的解決辦法是把數據庫的事務隔離級別調整到READ_COMMITTED。

2. 不可重複讀:

不可重複讀指的是同一個事務, 相同的查詢過程讀取出了不同的結果。比如說,事務T1讀取某一數據,事務T2讀取並修改了該數據,T1爲了對讀取值進行檢驗而再次讀取該數據,便得到了不同的結果。

那麼他的解決辦法是吧數據庫的事務隔離級別調整到REPEATABLE_READ。

3. 幻讀

幻讀指的是事務不獨立執行的時候,可能出現的錯誤。比如:A將數據庫中所有學生的成績從具體分數改爲ABCDE等級,但是系統管理員B就在這個時候插入了一條具體分數的記錄,當系統管理員A改結束後發現還有一條記錄沒有改過來,就好像發生了幻覺一樣。這就叫幻讀。

它的解決辦法是把數據庫的事務隔離級別調整到SERIALIZABLE_READ。

 

那麼數據庫的隔離級別到底有哪幾種呢?一般的數據庫隔離級別有四種:

未授權讀取

也稱爲讀未提交(Read Uncommitted):允許髒讀取,但不允許更新丟失。如果一個事務已經開始寫數據,則另外一個事務則不允許同時進行寫操作,但允許其他事務讀此行數據。該隔離級別可以通過“排他寫鎖”實現。

授權讀取

也稱爲讀提交(Read Committed):允許不可重複讀取,但不允許髒讀取。讀取數據的事務允許其他事務繼續訪問該行數據,但是未提交的寫事務將會禁止其他事務訪問該行。可以通過“瞬間共享讀鎖”和“排他寫鎖”實現。

可重複讀取(Repeatable Read)

禁止不可重複讀取和髒讀取,但是有時可能出現幻讀數據。讀取數據的事務將會禁止寫事務(但允許讀事務),寫事務則禁止任何其他事務。可以通過“共享讀鎖”和“排他寫鎖”實現。

序列化(Serializable):

提供嚴格的事務隔離。它要求事務序列化執行,事務只能一個接着一個地執行,不能併發執行。僅僅通過“行級鎖”是無法實現事務序列化的,必須通過其他機制保證新插入的數據不會被剛執行查詢操作的事務訪問到。

隔離級別越高,越能保證數據的完整性和一致性,但是對併發性能的影響也越大。對於多數應用程序,可以優先考慮把數據庫系統的隔離級別設爲Read Committed。它能夠避免髒讀取,而且具有較好的併發性能。儘管它會導致不可重複讀、幻讀和第二類丟失更新這些併發問題,在可能出現這類問題的個別場合,可以由應用程序採用悲觀鎖或樂觀鎖來控制。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章