【鎖】MySQL和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鎖標識位,不需要消耗額外的資源。

轉自:https://blog.51cto.com/ultrasql/1837368


免責聲明!

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



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