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...