1. 程式人生 > >spring 事務的隔離級別

spring 事務的隔離級別

spring有五大隔離級別:

ISOLATION_DEFAULT:用底層資料庫的預設隔離級別,資料庫管理員設定什麼就是什麼

ISOLATION_READ_UNCOMMITTED(未提交讀):最低隔離級別、事務未提交前,就可被其他事務讀取(會出現幻讀、髒讀、不可重複讀)

ISOLATION_READ_COMMITTED(提交讀):一個事務提交後才能被其他事務讀取到(該隔離級別禁止其他事務讀取到未提交事務的資料、所以還是會造成幻讀、不可重複讀)、sql server預設級別

ISOLATION_REPEATABLE_READ(可重複讀):可重複讀,保證多次讀取同一個資料時,其值都和事務開始時候的內容是一致,禁止讀取到別的事務未提交的資料(該隔離基本可防止髒讀,不可重複讀(重點在修改),但會出現幻讀(重點在增加與刪除))(MySql預設級別,更改可通過set transaction isolation level 級別)

ISOLATION_SERIALIZABLE(序列化):代價最高最可靠的隔離級別(該隔離級別能防止髒讀、不可重複讀、幻讀)

1.丟失更新:兩個事務同時更新一行資料,最後一個事務的更新會覆蓋掉第一個事務的更新,從而導致第一個事務更新的資料丟失,這是由於沒有加鎖造成的;

2.幻讀:同樣的事務操作過程中,不同時間段多次(不同事務)讀取同一資料,讀取到的內容不一致(一般是行數變多或變少)。

3.髒讀:一個事務讀取到另外一個未提及事務的內容,即為髒讀。

4.不可重複讀:同一事務中,多次讀取內容不一致(一般行數不變,而內容變了)。

幻讀與不可重複讀的區別:幻讀的重點在於插入與刪除,即第二次查詢會發現比第一次查詢資料變少或者變多了,以至於給人一種幻象一樣,而不可重複讀重點在於修改,即第二次查詢會發現查詢結果比第一次查詢結果不一致,即第一次結果已經不可重現了。

資料庫隔離級別越高,執行代價越高,併發執行能力越差,因此在實際專案開發使用時要綜合考慮,為了考慮併發效能一般使用提交讀隔離級別,它能避免丟失更新和髒讀,儘管不可重複讀和幻讀不能避免,但可以在可能出現的場合使用悲觀鎖或樂觀鎖來解決這些問題。