【數據庫】悲觀鎖與樂觀鎖與MySQL的MVCC實現簡述

悲觀鎖

悲觀鎖,就是一種悲觀心態的鎖,每次訪問數據時都會鎖定數據:
mysql

樂觀鎖

樂觀鎖,就是一種樂觀心態的鎖,每次訪問數據時並不鎖定數據,期待數據並沒做修改,若是數據沒被修改則做具體的業務
sql

應用程序上使用樂觀鎖的思想

MySQL的MVCC實現

多版本併發控制,MVCCMulti Version Concurrent Control,用於實現非鎖定的讀操做。
MySQL的InnoDB的可重複讀隔離級別中是經過在每條記錄中加建立版本刪除版本兩列來實現,這兩列的值是事務的版本號。併發

  • Insert操做,建立版本爲當前事務ID
  • Delete操做,刪除版本爲當前事務ID
  • Update操做,原記錄的刪除版本爲當前事務ID,新增一條更新後的記錄的建立版本爲當前事務ID
    數據的樣式大概以下圖:

若是須要查詢某個事務版本的數據,邏輯以下SQL(只是用SQL表示此邏輯以便理解,內部並不是這樣實現):mvc

select * from table where 建立版本 <= 當前版本 and (刪除版本 is null or 刪除版本 > 當前版本);

問題:可重複讀中MVCC如何保證第1次查詢和第2次查詢的一致性?

相關文章
相關標籤/搜索