MySQL 事務隔離級別實現原理

廖子博發表於2024-10-15

InnoDB 有兩種讀取資料的方式

  • 快照讀/一致性讀,MVCC
  • 當前讀,獲取讀寫鎖後讀取行的最新資料

InnoDB 用一致性讀檢視實現了 MVCC,用於支援讀已提交和可重複讀隔離級別的實現。

啟動事務時立即建立檢視

start transaction with consistent snapshot

快照讀

快照讀/MVCC

InnoDB 每個事務都有一個唯一的事務id,transaction id。
它是在事務開始的時候向 InnoDB 事務系統申請的,按申請順序嚴格遞增。

每次更新資料行時,InnoDB 會生成一個新的資料版本(undo log)並把 transaction id 賦值給這個資料版本的 row trx_id。

當前讀

如果應用邏輯是查詢後更新資料,應該使用當前讀,否則快照讀可能讀到舊資料,造成客戶端丟失更新。

更新語句和加鎖的查詢語句會使用當前讀。

加讀鎖

select ... lock in share mode

加寫鎖

select ... for update

相關文章