當前讀和快照讀

2022-03-16 16:22:09 字數 1006 閱讀 8335

innodb的預設事務隔離級別是rr(可重複讀)。它的實現技術是mvcc。基於版本的控制協議。該技術不僅可以保證innodb的可重複讀,而且可以防止幻讀。但是它防止的是快照讀,也就是讀取的資料雖然是一致的,但是資料是歷史資料。如何做到保證資料是一致的(也就是乙個事務,其內部讀取對應某乙個資料的時候,資料都是一樣的),同時讀取的資料是最新的資料。innodb提供了乙個間隙鎖的技術。也就是結合grap鎖與行鎖,達到最終目的。當使用索引進行插入的時候,innodb會將當前的節點和上乙個節點加鎖。這樣當進行select的時候,就不允許加x鎖。那麼在進行該事務的時候,讀取的就是最新的資料。

實現:1. 快照讀(snapshot read)

簡單的select操作(不包括 select ... lock in share mode, select ... for update)

2.當前讀(current read)

select ... lock in share mode

select ... for update

insert

update

delete

在rr級別下,快照讀是通過mvvc(多版本控制)和undo log來實現的,當前讀是通過加record lock(記錄鎖)和gap lock(間隙鎖)來實現的。

所以從上面的顯示來看,如果需要實時顯示資料,還是需要通過加鎖來實現。這個時候會使用next-key技術來實現。

總結:在mysql中,提供了兩種事務隔離技術,第乙個是mvcc,第二個是next-key技術。這個在使用不同的語句的時候可以動態選擇。不加lock inshare mode之類的就使用mvcc。否則使用next-key。mvcc的優勢是不加鎖,併發性高。缺點是不是實時資料。next-key的優勢是獲取實時資料,但是需要加鎖。同時需要注意幾點:1.事務的快照時間點是以第乙個select來確認的。所以即便事務先開始。但是select在後面的事務的update之類的語句後進行,那麼它是可以獲取後面的事務的對應的資料。2.mysql中資料的存放還是會通過版本記錄一系列的歷史資料,這樣,可以根據版本查詢資料。

當前讀和快照讀

在mvcc併發控制中,讀操作可以分成兩類 快照讀 snapshot read 與當前讀 current read 快照讀,讀取的是記錄的可見版本 有可能是歷史版本 不用加鎖。當前讀,讀取的是記錄的最新版本,並且,當前讀返回的記錄,都會加上鎖,保證其他事務不會再併發修改這條記錄。innodb的預設事務...

mysql 快照讀和當前讀

以下都是在可重複讀隔離級別情況下的 快照讀 普通的不加鎖的select就是快照讀。通過readview實現,可重複讀級別時,整個事務的普通select都是使用同乙個readview。readview相關請看文章 總之,可以理解為當前事務建立後,會立即生成乙個快照,查詢的結果都是基於這個快照。新的其他...

Mysql快照讀和當前讀

讀取的是記錄資料的可見版本 可能是過期的資料 不用加鎖 讀取的是記錄資料的最新版本,並且當前讀返回的記錄都會加上鎖,保證其他事務不會再併發的修改這條記錄 概念說的比較虛,也不好理解,接著舉乙個例子吧,假設你開啟了兩個事務,分別是a和b,這裡有個張表,user表,裡面有四條資料 x表示是排它鎖 exc...