當前讀與快照讀


概念

快照讀

  讀取的是記錄數據的可見版本(可能是過期的數據),不用加鎖

當前讀

  讀取的是記錄數據的最新版本,並且當前讀返回的記錄都會加上鎖,保證其他事務不會再並發的修改這條記錄
  概念說的比較虛,也不好理解,接着舉一個例子吧,假設你開啟了兩個事務,分別是A和B,這里有個張表,user表,里面有四條數據


 x表示是排它鎖(Exclusive),s表示共享鎖(Share),
image.png

1、select快照讀(照片)

  當你執行select *之后,在A與B事務中都會返回4條一樣的數據,這是不用想的,當執行select的時候,innodb默認會執行快照讀,相當於就是給你目前的狀態找了一張照片,以后執行select 的時候就會返回當前照片里面的數據,當其他事務提交了也對你不造成影響,和你沒關系,這就實現了可重復讀了,那這個照片是什么時候生成的呢?不是開啟事務的時候,是當你第一次執行select的時候,也就是說,當A開啟了事務,然后沒有執行任何操作,這時候B insert了一條數據然后commit,這時候A執行 select,那么返回的數據中就會有B添加的那條數據......之后無論再有其他事務commit都沒有關系,因為照片已經生成了,而且不會再生成了,以后都會參考這張照片。

2、update、insert、delete 當前讀

  當你執行這幾個操作的時候默認會執行當前讀,也就是會讀取最新的記錄,也就是別的事務提交的數據你也可以看到,這樣很好理解啊,假設你要update一個記錄,另一個事務已經delete這條數據並且commit了,這樣不是會產生沖突嗎,所以你update的時候肯定要知道最新的信息啊。

  我在這里介紹一下update的過程吧,首先會執行當前讀,然后把返回的數據加鎖,之后執行update。加鎖是防止別的事務在這個時候對這條記錄做什么,默認加的是排他鎖,也就是你讀都不可以,這樣就可以保證數據不會出錯了。但注意一點,就算你這里加了寫鎖,別的事務也還是能訪問的,是不是很奇怪?數據庫采取了一致性非鎖定讀,別的事務會去讀取一個快照數據。
  innodb默認隔離級別是RR, 是通過MVVC來實現了,讀方式有兩種,執行select的時候是快照讀,其余是當前讀,所以,mvvc不能根本上解決幻讀的情況




鏈接:https://www.jianshu.com/p/27352449bcc0


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM