快照讀和當前讀

一 一致性讀

  1. 一致性讀,也就是一致非鎖定讀,也可以稱爲快照讀,其實就是普通的讀取即普通 SELECT 語句。其中普通的 SELECT 操作不包括 select ... lock in share mode,select ... for update。
  2. 所謂的快照讀是指,在執行 SELECT 語句的時候,會生成一個快照。
  3. 對於可重複讀隔離級別,快照會在事務中第一次 SELECT 語句執行時生成,只有在本事務中對有數據變更纔會更新快照。因此,第一次 SELECT 之前已提交事務的變更你可以看到;如果已執行了 SELECT,那麼其它事務數據,你SELECT是看不到的。
  4. 對於讀提交隔離級別,每次讀取都會重新生成一個快照,讀取只承認在語句啓動前就已經提交完成的數據。

     可重複讀隔離級別下,一致性讀是通過 MVCC 和 undo log 來實現的。

二 當前讀

  1. 更新數據都是先讀後寫的,而這個讀,只能讀當前的值,稱爲“當前讀”(current read)。 
  2. select ... lock in share mode、select ... for update、insert、update、delete 都是當前讀。
  3. 以 update 爲例,假設一個事務 A 修改了數據,如果不是當前讀,事務 B 對同一行記錄的變更會導致事務 A 的變更。
  4. 事務 A 修改一行記錄的時候會添加 next-key 鎖,事務 B 需要等待事務 A 釋放 next-key 鎖。

     當前讀是通過對行記錄添加 next-key 鎖來實現的。

三 參考文檔

      https://dev.mysql.com/doc/refman/5.7/en/innodb-consistent-read.html

      https://dev.mysql.com/doc/refman/5.7/en/innodb-locking-reads.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章