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