一、next-key鎖。
當我們使用範圍條件而不是相等條件去檢索資料,並請求共享鎖和排他鎖時,innodb會給符合條件的已有的資料新增上鎖;對於鍵值在條件範圍內,但不存在的記錄,叫間隙。innodb此時會給這個部分新增上鎖,這種鎖機制就是next-key鎖。
假如:員工表emp中只有101條資料,其empid為1,2,3,.... ,101,下面sql
select * from emp where empid>100 for update ;
是乙個條件範圍的檢索,innodb不僅會對符合條件的empid值為101的記錄新增上鎖,也會對大於101(這些記錄不存在)的」間隙「加鎖。
innodb使用next-key鎖的目的一是防止幻讀,以滿足相關隔離級別的要求。對於上面的例子,如果不使用間隙鎖,如果其他事務插入了empid大於100的任何記錄,那麼本事務再次執行上述語句時必然出現幻讀;另一方面,是為了滿足恢復和複製的需要。很顯然,在使用範圍條件檢索並鎖定記錄時,innodb的這種加鎖機制會阻塞符合範圍條件內鍵值的併發插入,這往往會造成嚴重的鎖等待。因此,在實際的開發中,尤其是併發插入比較多的應用,我們盡量優化業務邏輯,盡量使用相等條件來訪問更新資料,避免使用範圍條件。
還要特別說明,innodb除了使用範圍條件加鎖時使用next-key鎖,如果使用相等條件刪除一條不存在的記錄,innodb也會使用next-key間隙鎖。
MySQL InnoDB鎖問題(四)
一 innodb行鎖實現方式。innodb行鎖是通過給索引上的索引項來加鎖實現的,如果沒有索引,innodb將通過隱藏的聚簇索引來對記錄加鎖。innodb行鎖分三種情形。1 record lock 對索引項加鎖。2 grap lock 對索引項之間的 間隙 第一條記錄前的 間隙 或者最後一條記錄後的...
MySQL InnoDB鎖問題(六)
一 在innodb情況下什麼時候使用表鎖。對於innodb表,大多數情況都應該使用行鎖,因為事務和行鎖往往是我們選擇innodb表的重要原因。但在特殊的情況下,也可以使用表級鎖。1 事務需要更新大部分資料或者全部資料,表又比較大,如果使用預設的行級鎖,不僅使得事務執行比較慢效率低,而且可能造成其他事...
Mysql innodb引擎(二)鎖
專案 isixsx is相容 相容相容 不相容ix 相容相容 不相容不相容s相容 不相容相容 不相容x 不相容不相容 不相容不相容 是指 innodb 通過多版本控制的方式來讀取當前執行時間資料庫中的資料。如果,讀取的時候行正好在執行 delete 或 update 的排他操作,那讀取操作不會等待,...