MySQL和Oracle行鎖比較

有人問,MySQL裏Update時條件列沒有索引,產生的是表級鎖,而Oracle裏是行級鎖。


下面來對比下MySQL InnoDB引擎和Oracle的行鎖機制:


InnoDB


  1. INNODB表是索引組織的表,主鍵是聚集索引,非主鍵索引都包含主鍵信息。


  2. INNODB默認是行鎖。


  3. INNODB行鎖是通過給索引項加鎖來實現的,即只有通過索引條件檢索數據,InnoDB才使用行級鎖,否則將使用表鎖。


InnoDB行鎖實現方式


InnoDB行鎖是通過給索引上的索引項加鎖來實現的,如果沒有索引,InnoDB將通過隱藏的聚集索引來對記錄加鎖。InnoDB行鎖分爲3種情形。


  • Record lock:對索引項加鎖。

  • Gap lock:對索引項之間的“間隙”、第一條記錄前的“間隙”或最後一條記錄後的“間隙”加鎖。

  • Next-key lock:前兩種的組合,對記錄及其前面的間隙加鎖。


InnoDB這種行鎖實現特點意味着:如果不通過索引條件檢索數據,那麼InnoDB將對錶中的所有記錄加鎖,實際效果跟表鎖一樣!


在實際應用中,要特別注意InnoDB行鎖的這一特性,否則可能導致大量的鎖衝突。


Oracle


  1. 在Oracle的每行數據上,都有一個標誌位來表示該行數據是否被鎖定。這樣就大大減小了行級鎖的維護開銷,數據行上的鎖標誌一旦被置位,就表明該行數據被加X鎖,Oracle在數據行上沒有S鎖。


  2. 許多對Oracle不太瞭解的技術人員可能會以爲每一個TX鎖代表一條被封鎖的數據行,其實不然。TX的本義是Transaction(事務),當一個事 務第一次執行數據更改(Insert、Update、Delete)或使用SELECT… FOR UPDATE語句進行查詢時,它即獲得一個TX(事務)鎖,直至該事務結束(執行COMMIT或ROLLBACK操作)時,該鎖才被釋放。所以,一個TX 鎖,可以對應多個被該事務鎖定的數據行。


  3. ORACLE的行級鎖 只是數據塊頭的ITL、數據行頭的LB鎖標識位,不需要消耗額外的資源。需要注意的是事務並不是被行阻塞,而是被其它的事務阻塞。所以某些數據庫就有鎖升級機制,而ORACLE沒有。ORACLE的行級鎖 只是數據塊頭的ITL、數據行頭的LB鎖標識位,不需要消耗額外的資源。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章