首頁 > 軟體

Mysql事務的隔離級別(髒讀+幻讀+可重複讀)

2022-08-24 18:03:01

前言:

因為InnoDB是支援事務的,所以只對InnoDB的事務進行討論。

一、事務

(一)什麼是事務

事務是由一組SQL語句組成的邏輯處理單元,是一組不可分割的操作序列。

(二)事務的特徵

  • 原子性(Actomicity):事務是一個原子操作單元,其對資料的修改,要麼全都執行,要麼全都不執行
  • 一致性(Consistent):在事務開始和完成時,資料都必須保持一致狀態。
  • 隔離性(Isolation):資料庫系統提供一定的隔離機制,保證事務在不受外部並行操作影響的“獨立”環境執行。
  • 永續性(Durable):事務完成之後,它對於資料的修改是永久性的,即使出現系統故障也能夠保持。

(三)手動開啟、提交、回滾事務

-- 開啟事務
start transaction;
update user_count set balance = balance + 20 where id = 1;
update user_count set balance = balance - 20 where id =2;
-- 回滾事務
rollback;
-- 提交事務
commit;

注意:在回滾和提交之前,資料庫中的資料都是操作的快取中的資料,而不是資料庫中的真實資料。

二、髒讀、幻讀、可重複讀

(一)髒讀 read uncommit

讀取到了未提交的資料。

髒讀對應的是read uncommitted讀未提交的事務隔離級別,即從快取中讀取資料,而不是讀取已經持久化的資料。

事務B在select的時候,讀取到了被事務A更新在快取的資料,但是該資料沒有真正的持久化到資料庫中,一旦事務A會滾,事務B就會讀到錯誤的髒資料。

(二)不可重複讀 unrepeatable

一個事務在讀取某些資料已經發生了改變、或某些記錄已經被刪除了!這種現象叫做“不可重複讀”。

不可重複讀產生的場景對應的是read committed讀已提交的事務隔離級別,即事務讀取的資料都是已經完成持久化的資料。

(三)幻讀

同一事務內,同樣的篩選條件,查詢出來的資料條數發生了變化,(另一個事務搶到CPU進行了刪除或者插入條件),這種現象就稱為“幻讀” 。
幻讀產生的場景對應的是repeatable read可重複讀的事務隔離級別,事務讀取的資料都是已經完成持久化的資料,並且為事務在修改的資料增加行鎖,但是沒有表鎖。

(四)不可重複讀和幻讀的區別

不可重複讀針對的是同一條資料,讀的是別的事務修改之前的樣子,一旦事務的隔離級別使用了unrepeatable read,加上行鎖,就可以避免產生。
幻讀針對的是滿足篩選條件的一批資料,因為行鎖不能阻止插入和刪除資料,所以會導致查詢到的條數是錯誤的,使用serializable可以避免。

三、事務的隔離級別

 髒讀不可重複讀幻讀
read uncommitted
read committed 
repeatable read  
serializable   

設定表的隔離級別sql語言如下:

-- 查詢資料庫當前的隔離級別
select @@transaction_isolation
-- 讀未提交
set session transaction isolation level read uncommitted;
-- 讀已提交
set session transaction isolation level read committed;
-- 不可重複讀
set session transaction isolation level repeatable read;
-- 序列化(序列執行)
set session transaction isolation level serializable;

(一)讀未提交read uncommitted

讀快取裡面的資料,風險最高但是允許的並行最多

(二)讀已提交read committed

讀持久化的資料,不讀快取的資料,不加鎖

(三)不可重複讀 read repeatable

讀可持久化的資料的資料,並且新增行級鎖(一個事務在修改某行資料的時候,別的事務阻塞等待提交才能讀到)

(四)序列化 serializable

最安全但是並行效率最低,讀持久化資料,並且加表鎖,如果事務並行的多,需要一直阻塞,不建議使用。

事務的隔離級別從低到高依次是 read uncommitted , read committed, repeatable read , serializable 。隔離級別越低,越能支援高並行的資料操作,與此同時,也會帶來越高的並行風險,Mysql資料庫預設的隔離級別是repeatable read 。

到此這篇關於Mysql事務的隔離級別(髒讀+幻讀+可重複讀)的文章就介紹到這了,更多相關Mysql事務隔離內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com