髒讀、幻讀、不可重複讀和丟失更新

1.髒讀 -- 一個事務讀取到另一個事務沒有提交的數據數據庫

事務T1:更新一條數據
          -->事務T2:讀取事務T1更新的記錄
 事務T1:調用commit進行提交
 此時事務T2讀取到的數據是保存在數據庫內存中的數據,稱爲髒數據,這個過程稱爲髒讀。spa

2.幻讀  -- 用同一的操做讀取2次,獲得的記錄數不相同接口

事務T1:查詢表中全部記錄
          -->事務T2:插入一條記錄
          -->事務T2:調用commit進行提交
事務T1:再次查詢表中全部記錄事務

注意:幻讀重點在新增或刪除。內存

3.不可重複讀 -- 在同一事務中,2次讀取同一數據,獲得內容不一樣it

事務T1:查詢一條記錄
         -->事務T2:更新事務T1查詢的記錄
         -->事務T2:調用commit進行提交
事務T1:再次查詢上次的記錄
此時事務T1對同一數據查詢了兩次,可獲得的內容不一樣,稱爲不可重複讀。io

注意:不可重複讀重點在修改。效率

4.丟失更新(Lost Update) 

事務T1讀取了數據,並執行了一些操做,而後更新數據。事務T2也作相同的事,則T1和T2更新數據時可能會覆蓋對方的更新,從而引發錯誤。date

5.處理以上隔離級別的問題,採用以下方法:方法

  事務隔離五種級別:
        (1)TRANSACTION_NONE  不使用事務。
        (2)TRANSACTION_READ_UNCOMMITTED  容許髒讀。
        (3)TRANSACTION_READ_COMMITTED  防止髒讀,最經常使用的隔離級別,而且是大多數數據庫的默認隔離級別。
        (4)TRANSACTION_REPEATABLE_READ  能夠防止髒讀和不可重複讀。
        (5)TRANSACTION_SERIALIZABLE  能夠防止髒讀,不可重複讀取和幻讀,(事務串行化)會下降數據庫的效率。

  以上的五個事務隔離級別都是在Connection接口中定義的靜態常量,使用setTransactionIsolation(int level) 方法能夠設置事務隔離級別。

  如:con.setTransactionIsolation(Connection.REPEATABLE_READ)。

  注意:事務的隔離級別受數據庫的限制,不一樣的數據庫支持的的隔離級別不必定相同。

相關文章
相關標籤/搜索