Mysql(Innodb)如何避免幻讀


Mysql(Innodb)如何避免幻讀 有意思

MySQL InnoDB支持三種行鎖定方式:

  •   行鎖(Record Lock):鎖直接加在索引記錄上面,鎖住的是key。
  •   間隙鎖(Gap Lock):鎖定索引記錄間隙,確保索引記錄的間隙不變。間隙鎖是針對事務隔離級別為可重復讀或以上級別而已的。
  •   Next-Key Lock :行鎖和間隙鎖組合起來就叫Next-Key Lock。

  鎖選擇

  • 如果更新條件沒有走索引,例如執行”update from t1 set v2=0 where v2=5;” ,此時會進行全表掃描,掃表的時候,要阻止其他任何的更新操作,所以上升為表鎖。
  • 如果更新條件為索引字段,但是並非唯一索引(包括主鍵索引),例如執行“update from t1 set v2=0 where v1=9;” 那么此時更新會使用Next-Key Lock。使用Next-Key Lock的原因:
  1. 首先要保證在符合條件的記錄上加上排他鎖,會鎖定當前非唯一索引和對應的主鍵索引的值;
  2. 還要保證鎖定的區間不能插入新的數據。
  • 如果更新條件為唯一索引,則使用Record Lock(記錄鎖)。
  • InnoDB根據唯一索引,找到相應記錄,將主鍵索引值和唯一索引值加上記錄鎖。但不使用Gap Lock(間隙鎖)

 

InnoDB鎖機制之Gap Lock、Next-Key Lock、Record Lock解析


免責聲明!

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



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