我在這裡分享一篇關於 mysql 的可重複讀介紹,講得挺好的,可以解決一些疑惑,鏈結在下方引用處。
sql 1992 年標準關於幻讀 (phantom) 的解釋:
「乙個事務 t1 根據某些查詢條件 讀取某幾行資料,然後事務 t2 執行 sql 語句插入一行或多行滿足查詢條件 的資料;這時候如果事務 t1 重複跟第一次查詢一樣的操作就會獲取到不同的幾行資料。」
幻讀比起不可重複讀更加側重強調兩次查詢得到的行數不一樣(多了或少了),或者行數一樣但不是同一批(被替換了)。
這個是英文原版:
p3 ("phantom"): sql-transaction t1 reads the set of rows n
that satisfy some . sql-transaction t2 then
executes sql-statements that generate one or more rows that
satisfy the used by sql-transaction t1. if
sql-transaction t1 then repeats the initial read with the same
, it obtains a different collection of rows.
而且,根據定義,sql 標準的可重複讀無法解決幻讀問題。
但是,mysql 的可重複讀比 sql 的可重複讀的標準要更高,具體表現為:僅僅用 select 語句時幻讀不會發生(這種情況簡稱 phantom reads),但是出現與寫有關的操作時幻讀會發生(這種情況簡稱 phantom writes)。
比如乙個事務兩次 select 都得到一樣的行數和一樣的值,沒有幻讀出現;但是進行 update 或 insert 操作時卻報錯了,而且可以發現多出了原本不存在的行,就像出現了幻覺一樣。
幻讀的英文就是 phantom。phantom reads 可以理解為幻讀的其中一種情況,而 phantom writes 是另一種情況。從定義上來看,phantom reads 和 phantom writes 都可以理解為幻讀。
所以這就解釋了某些文章會說 mysql 的可重複讀可以防止某些幻讀情況的出現。
另外,從面試的角度來說,如果沒有強調是 mysql 的情況,可以忽略這些,只要按照 sql 的關於幻讀和可重複讀的定義來回答即可。如果面試官問到了 mysql 的特殊情況,可以根據 mysql 本身的執行機制和自己的實踐經驗進行回答。
一篇關於 mysql 的可重複讀介紹:
下面是 1992 年的 sql 標準關於 幻讀(phantom)的描述原文,網頁載入比較慢,要等網頁載入完後再全文檢索 「phantom」 關鍵字:
mysql 可重複讀。
一 可重複讀 我們先看看現象,再分析原理。我的mysql版本是5.5。下面是一張表,只有一條資料,並且我開啟了事物 此時,另乙個事物將record加1,因此我在開啟乙個命令列客戶端,執行下面的命令 成功加1之後,實際上,資料庫中record肯定是2。然後回到之前的客戶端,再查一次 沒毛病,recor...
mysql可重複讀
mysql innodb的預設隔離級別是可重複讀,之前理解有些偏差,查閱一些資料後總結出幾點 首先有兩個概念 一致性檢視 當乙個事務開啟時,innodb會生成乙個檢視,這個檢視是邏輯檢視,通過undo log和row tranzaction id控制實現。在該事務的任何時間點,一致性檢視中的資料都是...
mysql 提交讀 可重複讀
環境 mysql select version version 5.6.31 log 1 row in set 0.00 sec 檢視當前資料庫隔離級別 mysql select global.tx isolation,tx isolation global.tx isolation tx isol...