四種事務的隔離級別

2021-09-25 17:01:05 字數 1827 閱讀 1498

sql 標準定義的四個隔離級別為: read uncommitted (未提交讀) 、 read committed (提交讀)、 repeatable read (可重複讀)、 serializable (可序列化) ,下面分別介紹。

1、未提交讀:

就是乙個事務可以讀取另乙個未提交事務的資料。

(1)開啟乙個客戶端a,並設定當前事務模式為read uncommitted(未提交讀),查詢表account的初始值:

(2)在客戶端a的事務提交之前,開啟另乙個客戶端b,更新表account:

(3)這時,雖然客戶端b的事務還沒提交,但是客戶端a就可以查詢到b已經更新的資料。

(4)一旦客戶端b的事務因為某種原因回滾,所有的操作都將會被撤銷,那客戶端a查詢到的資料其實就是髒讀資料

2、讀提交

就是乙個事務要等另乙個事務提交後才能讀取資料。

(1)開啟乙個客戶端a,並設定當前事務模式為read committed(未提交讀),查詢表account的所有記錄;

(2)在客戶端a的事務提交之前,開啟另乙個客戶端b,更新表account;

(3)這時,客戶端b的事務還沒提交,客戶端a不能查詢到b已經更新的資料,解決了髒讀問題;

(4)客戶端b的事務提交;

(5)客戶端a執行與上一步相同的查詢,結果 與上一步不一致,即產生了不可重複讀的問題

3、重複讀

就是在開始讀取資料(事務開啟)時,不再允許修改操作

(1)開啟乙個客戶端a,並設定當前事務模式為repeatable read,查詢表account的所有記錄

(2)在客戶端a的事務提交之前,開啟另乙個客戶端b,更新表account並提交

(3)在客戶端a查詢表account的所有記錄,與步驟(1)查詢結果一致,沒有出現不可重複讀的問題。

(4)重複讀可以解決不可重複讀問題。寫到這裡,應該明白的一點就是,不可重複讀對應的是修改,即update操作。但是可能還會有幻讀問題。因為幻讀問題對應的是插入insert操作,而不是update操作。

(5)重新開啟客戶端b,插入一條新資料後提交;

(6)在客戶端a查詢表account的所有記錄,沒有 查出 新增資料,所以沒有出現幻讀

4、serializable 序列化(序列化)

序列化是最高的事務隔離級別,在該級別下,事務序列化順序執行,可以避免髒讀、不可重複讀與幻讀。但是這種事務隔離級別效率低下,比較耗資料庫效能,一般不使用。

1、事務隔離級別為讀提交時,寫資料只會鎖住相應的行;

2、事務隔離級別為可重複讀時,如果檢索條件有索引(包括主鍵索引)的時候,預設加鎖方式是next-key 鎖;如果檢索條件沒有索引,更新資料時會鎖住整張表。乙個間隙被事務加了鎖,其他事務是不能在這個間隙插入記錄的,這樣可以防止幻讀;

3、事務隔離級別為序列化時,讀寫資料都會鎖住整張表;

4、隔離級別越高,越能保證資料的完整性和一致性,但是對併發效能的影響也越大。

不同的隔離級別有不同的現象,並有不同的鎖和併發機制,隔離級別越高,資料庫的併發效能就越差, 4 種事 隔離級別與併發效能的關係:

事務四種隔離級別

1.讀取未提交 乙個事務可以讀取另乙個未提交的事務的資料。髒讀 2.讀取已提交 事務a多次讀取同一資料,事務b在事務a多次讀取的過程中,對資料做了更新並提交,導致事務a多次讀取同一資料時,結果不一致。不可重複度 對應update操作 3.可重複讀 開始讀取資料時 事務開啟時 不在允許修改操作。可能會...

事務的四種隔離級別

資料庫事務的隔離級別有4種,由低到高分別為read uncommitted read committed repeatable read serializable 在事務的併發操作中可能會出現髒讀,不可重複讀,幻讀。具體可參照該篇部落格 read uncommitted 讀未提交,即乙個事務可以讀取...

事務的四種隔離級別

事務的四種隔離級別 1.read uncommitted 讀未提交,存在髒讀,不可重複讀,幻讀問題 2.read committed 讀已提交,解決了髒讀,存在不可重複讀,幻讀問題 3.repeatable read 可重複讀,解決了髒讀,不可重複讀,存在幻讀問題,是mysql預設隔離級別,使用mm...