在鎖讀的過程中,一個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。但是隻有掃描唯一索引記錄時設定索引記錄鎖