mysql到底是怎麼解決幻讀的?

2021-09-24 01:42:08 字數 738 閱讀 5423

mysql到底是怎麼解決幻讀的?

mvcc是什麼,怎麼實現的?

先理解幾個概念

非鎖定的一致性讀

圖中左邊為非一致性讀部分

【非一致性讀】

在sql查詢的時候,如果發現記錄已經被加了x鎖,會轉而查詢當前記錄回滾段中最近的快照,讀快照不加鎖,非常快;

【mvcc】

多版本控制

這裡的多版本就是指的回滾段的快照,用來解決幻讀的情況,即aba的問題;

【鎖演算法】

record:記錄鎖,單行記錄加鎖

gap:間隙鎖,鎖住乙個範圍

next-key:等於record+gap兩者結合

【場景解釋】

背景:表:tab,主鍵=id,索引=user_id

當發生update tab set age = 10 where user_id>10;時候,加鎖如下:

1.主鍵索引id會給id=10的記錄加上record行鎖

2.索引user_id上會加上gap鎖,鎖住user_id (10,+無窮大)這個範圍

所以,在插入 user_id =100的記錄時候會命中第二個索引上加的鎖會報出事務異常;

所以在事務中即使查詢多次user_id>10的返回結果都是一樣的,因為期間內的資料都沒有變化,這樣就解決了幻讀的問題;

MySQL 到底是怎麼解決幻讀的?

在一次事務裡面,多次查詢之後,結果集的個數不一致的情況叫做幻讀。而多出來或者少的哪一行被叫做幻行。在高併發資料庫系統中,需要保證事務與事務之間的隔離性,還有事務本身的一致性。如果你看到了這篇文章,那麼我會預設你了解了髒讀 不可重複讀與可重複讀。多數資料庫都實現了多版本併發控制,並且都是靠儲存資料快照...

MySql系列 MySQL 到底是怎麼解決幻讀的?

什麼是幻讀?在一次事務裡面,多次查詢之後,結果集的個數不一致的情況叫做幻讀。而多出來或者少的哪一行被叫做幻行。為什麼要解決幻讀?在高併發資料庫系統中,需要保證事務與事務之間的隔離性,還有事務本身的一致性。mysql 是如何解決幻讀的?如果你看到了這篇文章,那麼我會預設你了解了髒讀 不可重複讀與可重複...

MySQL談談InnoDB怎麼解決幻讀的

首先說結論,在rr的隔離級別下,innodb使用mvcc和next key locks解決幻讀,mvcc解決的是普通讀 快照讀 的幻讀,next key locks解決的是當前讀情況下的幻讀。事務a,先執行 update table set name hh where id 3 結果為 ok row...