幻讀指的是乙個事務在前後兩次查詢同乙個範圍的時候,後一次查詢看到了前一次查詢沒有看到的行。
「幻讀」做乙個說明:
在可重複讀隔離級別下,普通的查詢是快照讀,是不會看到別的事務插入的資料的。因此,幻讀在當前讀下才會出現。
第二次檢視,發現被修改的「行」,不能稱為幻讀,幻讀僅專指「新插入的行」。
當前讀:也叫即時讀,就是忽略版本控制,讀取最新的資料。
首先是語義上的
是資料一致性的問題。
讀鎖是行鎖,無法解決幻讀問題,因此引入間隙鎖(gap鎖)
間隙鎖和鎖之間不存在衝突關係。
跟間隙鎖存在衝突關係的,是「往這個間隙中插入乙個記錄」這個操作。
間隙鎖和行鎖合稱 next-key lock,每個 next-key lock 是前開後閉區間。
間隙鎖的引入,可能會導致同樣的語句鎖住更大的範圍,這其實是影響了併發度的。
間隙鎖是在可重複讀隔離級別下才會生效的。所以,你如果把隔離級別設定為讀提交的話,就沒有間隙鎖了。但同時,你要解決可能出現的資料和日誌不一致問題,需要把 binlog 格式設定為 row。
當 mysqldump 使用引數–single-transaction 的時候,導資料之前就會啟動乙個事務,來確保拿到一致性檢視。而由於 mvcc 的支援,這個過程中資料是可以正常更新的。
如果在唯一索引上面使用等值查詢,間隙鎖會退化成行鎖。
在刪除資料的時候盡量加 limit。這樣不僅可以控制刪除資料的條數,讓操作更安全,還可以減小加鎖的範圍。
什麼是髒讀 不可重複讀 幻讀
在事務a修改資料之後提交資料之前,這時另乙個事務b來讀取資料,如果不加控制,事務b讀取到a修改過資料,之後a又對資料做了修改再提交,則b讀到的資料是髒資料,此過程稱為髒讀dirty read。乙個事務內在讀取某些資料後的某個時間,再次讀取以前讀過的資料,卻發現其讀出的資料已經發生了變更 或者某些記錄...
什麼是髒讀?幻讀?不可重複讀?
sql 標準定義了四個隔離級別 這裡需要注意的是 mysql 預設採用的 repeatable read隔離級別 oracle 預設採用的 read committed隔離級別 事務隔離機制的實現基於鎖機制和併發排程。其中併發排程使用的是mvvc 多版本併發控制 通過儲存修改的舊版本資訊來支援併發一...
什麼是髒讀,不可重複讀,幻讀
1.髒讀 髒讀就是指當乙個事務正在訪問資料,並且對資料進行了修改,而這種修改還沒有提交到資料庫中,這時,另外乙個事務也訪問這個資料,然後使用了這個資料。2.不可重複讀 是指在乙個事務內,多次讀同一資料。在這個事務還沒有結束時,另外乙個事務也訪問該同一資料。那麼,在第乙個事務中的兩 次讀資料之間,由於...