本文是根據慕課相關課程學習後,並總結了以下幾篇博文後做的總結
innodb的預設事務隔離級別是rr(可重複讀)。它的實現技術是mvcc。基於版本的控制協議。該技術不僅可以保證innodb的可重複讀,而且可以防止幻讀。但是它防止的是快照讀,也就是讀取的資料雖然是一致的,但是資料是歷史資料。如何做到保證資料是一致的(也就是乙個事務,其內部讀取對應某乙個資料的時候,資料都是一樣的),同時讀取的資料是最新的資料。innodb提供了乙個間隙鎖的技術。也就是結合gap鎖與行鎖,達到最終目的。當使用索引進行插入的時候,innodb會將當前的節點和上乙個節點加鎖。這樣當進行select的時候,就不允許加x鎖。那麼在進行該事務的時候,讀取的就是最新的資料。
當前讀(current read)
rc、rr級別下的innodb的非阻塞讀如何實現
下面我們看一下演示
上圖為將field2欄位由12改為32。此時我們將原資料存出來undo log,我們將回滾指標指向undo log的原資料,同時db_trx_ id加1。如果我們之後進行回滾,則從undo log中獲取資料,進行回滾。
同樣下圖為兩個undo log日誌
innodb可重複讀隔離級別下如何避免幻讀
對主鍵索引或者唯一索引會用gap鎖嗎??
如資料庫中存在id為1,3,5的值,如果我們查詢where id in (1,3); 此時我們會發現只有行鎖,我們update id= 2;是成功的,但是如果我們查詢where id in (1,4); 此時我們會發現有gap鎖,我們update id= 2;是無法成功的,只有等查詢事務結束後才能update
當前讀與快照讀
讀取的是記錄資料的可見版本 可能是過期的資料 不用加鎖 讀取的是記錄資料的最新版本,並且當前讀返回的記錄都會加上鎖,保證其他事務不會再併發的修改這條記錄 概念說的比較虛,也不好理解,接著舉乙個例子吧,假設你開啟了兩個事務,分別是a和b,這裡有個張表,user表,裡面有四條資料 1 select快照讀...
當前讀和快照讀
在mvcc併發控制中,讀操作可以分成兩類 快照讀 snapshot read 與當前讀 current read 快照讀,讀取的是記錄的可見版本 有可能是歷史版本 不用加鎖。當前讀,讀取的是記錄的最新版本,並且,當前讀返回的記錄,都會加上鎖,保證其他事務不會再併發修改這條記錄。innodb的預設事務...
快照讀以及當前讀
innodb的預設事務隔離級別是rr 可重複讀 它的實現技術是mvcc。基於版本的控制協議。該技術不僅可以保證innodb的可重複讀,而且可以防止幻讀。但是它防止的是快照讀,也就是讀取的資料雖然是一致的,但是資料是歷史資料。如何做到保證資料是一致的 也就是乙個事務,其內部讀取對應某乙個資料的時候,資...