innodb中不同語句設置不同鎖類型

  在鎖讀的過程中,一個update 或一個delete 經常設置記錄鎖在每一個索引記錄上。這與where條件中是否排除此條索引記錄沒有關係。innodb認不出擴展的where擴展條件,只會認出那些索引區間被掃描。The locks are normally next-key locks that also block inserts into the gap immediately before the record。通常,gap locking不能顯示使用,導致next-key locking 也不能用。大多數情況下,事務隔離級別也會影響lock的設置。

 如果一個二級索引在查找記錄過程中使用,那麼索引記錄被設置x-lock。如果沒有滿足的索引,那麼將是全表掃描,表中每一條記錄都會比鎖定。併發降低,效率下降,創建好的索引會掃描不必要的記錄。

select ..... for update or select .... lock in share mode 下,掃描記錄 請求locks。

innodb 設定的特定鎖類型

  select ......from 鎖定讀,讀取數據庫快照而不用設置locks。在serializable level,在索引記錄將設置 next-key locks

 select .... from ...lock in share mode 在全部的索引記錄上設置一個共享的next-key locks,只有掃描是唯一索引時設置record lock。

 select.... from .... for update 在全部的索引記錄上設置一個排他的next-key locks,只有掃描是唯一索引時設置索引記錄鎖。

update.....where ....設置排他的next-key lock。但是隻有掃描唯一索引記錄時設定索引記錄鎖

delete......where.... 設置排他的next-key lock。但是隻有掃描唯一索引記錄時設定索引記錄鎖

 


發佈了193 篇原創文章 · 獲贊 30 · 訪問量 49萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章