mysql一致性讀

不要亂摸發表於2018-01-10

Consistent Nonlocking Reads

一致讀意味著InnoDB用多版本來提供一個查詢資料庫某個時間點的快照。這種查詢可以看到在當前世界點之前事務提交的改變,看不到此後提交的改變,更看不到未提交的改變。這個規則有一種例外情況是它可以看到同一個事務中在這個查詢之前的改變。這種異常就造成:如果你更新一個表中的行,一個SELECT可以看到這些被更新的行的最近的版本,同時它也可以看到任意行的更舊的版本,如果另一個事務同時更新這個表的話就意味著你可能看到這個表的某一個狀態但是這種狀態其實在資料庫中不存在。

如果事務隔離級別是REPEATABLE_READ,那麼所有在同一個事務中的一致讀將會讀到在這個事務中第一個讀到的那個穩定的快照版本。如果你提交當前事務,並且在隨後執行相同的查詢,那麼你將得到更新的快照版本。

在READ_COMMITTED和REPEATABLE_READ隔離級別下一致讀是InnoDB處理SELECT預設的方式。一致讀不會對它所訪問的表設定任何鎖,因此在一致讀的同時其它事務可以隨意修改這個表。

假設事務隔離級別是REPEATABLE_READ,當你執行一致讀的時候,InnoDB根據你查詢這個資料庫的時間來給你的事務一個時間點。如果在你的時間點以後另一個事務刪除了一行並且提交了,那麼你不會看到這一行,因為它已經被刪除了。插入和修改也和這類似。

這叫多版本併發控制

下面的例子中,只有當B已經提交它的插入並且A也提交了,A才能看到B的插入

 

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

 

相關文章