天天看點

事務隔離級别

原文:

事務隔離級别

https://schaepher.github.io/2020/04/24/acid-isolation/

事務隔離級别有四種。它們的差別在于一個修改資料的事務在送出前和送出後,另一個進行中的事務讀取到的資料是修改前還是修改後的資料。

  • READ-UNCOMMITED = 讀-未送出
  • READ-COMMITED = 讀-已送出
  • REPEATABLE-READ = 可重複-讀 (InnoDB)
  • SERIALIZABLE = 串行

以下假設事務B都處于進行中。

事務A進行中:

隔離級别 事務B 問題
READ-UNCOMMITED 修改後 髒讀(事務復原)
READ-COMMITED 修改前
REPEATABLE-READ
SERIALIZABLE 阻塞 并發能力低

事務A送出後:

不可重複讀(update/delete)
修改前(快照資料 undo段) 幻讀(insert)可通過 Next-Key Lock 解決

修改資料會加 X 鎖。

查詢資料需要使用以下方式:

  • SELECT ... FOR UPDATE

    加 X 鎖
  • SELECT ... LOCK IN SHARE MODE

    加 S 鎖

鎖會在事務結束後釋放。

由于每條語句都是單獨一個事務,且資料庫使用 Auto Commit,結果是在執行語句後會自動送出事務。

是以如果不主動開啟事務或者關閉 Auto Commit,就算執行時加了鎖,在 SELECT 事務結束後會立即釋放。無法達到目的。

關閉自動送出:

SET AUTOCOMMIT=0;
           

開啟事務(兩者等效):

BEGIN;
           
START TRANSACTION;
           

兩種開啟事務的方式都使用

COMMIT;

來送出事務。

事務隔離級别

本文采用知識共享署名 2.5 中國大陸許可協定進行許可。歡迎轉載,演繹或用于商業目的,但是必須保留本文的署名 schaepher(包含連結)。如您有任何疑問或者授權方面的協商,請給我留言。

繼續閱讀