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)。
注意:事務的隔離級別受數據庫的限制,不一樣的數據庫支持的的隔離級別不必定相同。