MySQL和Oracle行鎖比較

2021-09-03 10:34:31 字數 1014 閱讀 8174

有人問,mysql裡update時條件列沒有索引,產生的是表級鎖,而oracle裡是行級鎖。

下面來對比下mysql innodb引擎和oracle的行鎖機制:

innodb

innodb表是索引組織的表,主鍵是聚集索引,非主鍵索引都包含主鍵資訊。

innodb預設是行鎖。

innodb行鎖是通過給索引項加鎖來實現的,即只有通過索引條件檢索資料,innodb才使用行級鎖,否則將使用表鎖。

innodb行鎖實現方式

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

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

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

oracle

在oracle的每行資料上,都有乙個標誌位來表示該行資料是否被鎖定。這樣就大大減小了行級鎖的維護開銷,資料行上的鎖標誌一旦被置位,就表明該行資料被加x鎖,oracle在資料行上沒有s鎖。

許多對oracle不太了解的技術人員可能會以為每乙個tx鎖代表一條被封鎖的資料行,其實不然。tx的本義是transaction(事務),當乙個事 務第一次執行資料更改(insert、update、delete)或使用select… for update語句進行查詢時,它即獲得乙個tx(事務)鎖,直至該事務結束(執行commit或rollback操作)時,該鎖才被釋放。所以,乙個tx 鎖,可以對應多個被該事務鎖定的資料行。

oracle的行級鎖 只是資料塊頭的itl、資料行頭的lb鎖標識位,不需要消耗額外的資源。需要注意的是事務並不是被行阻塞,而是被其它的事務阻塞。所以某些資料庫就有鎖公升級機制,而oracle沒有。oracle的行級鎖 只是資料塊頭的itl、資料行頭的lb鎖標識位,不需要消耗額外的資源。

mysql行鎖表鎖區別 mysql表鎖和行鎖區別

一 表鎖 特點 偏向myisam儲存引擎,開銷小,加鎖快 無死鎖 鎖定粒度大,發生鎖衝突的概率最高,併發度最低。我們在編輯表,或者執行修改表的事情了語句的時候,一般都會給表加上表鎖,可以避免一些不同步的事情出現,表鎖分為兩種,一種是讀鎖,一種是寫鎖。我們可以手動給表加上這兩種鎖,語句是 lock t...

mysql行鎖和表鎖

在呼叫儲存過程中,就會涉及到表鎖,行鎖這一概念 所謂區別 有索引的時候就是行鎖,沒有索引的時候就是表索。innodb 的行鎖是在有索引的情況下,沒有索引的表是鎖定全表的.表鎖演示 無索引 session1 mysql set autocommit 0 mysql select from innodb...

mysql行鎖和表鎖

在呼叫儲存過程中,就會涉及到表鎖,行鎖這一概念 所謂區別 有索引的時候就是行鎖,沒有索引的時候就是表索。innodb 的行鎖是在有索引的情況下,沒有索引的表是鎖定全表的.表鎖演示 無索引 session1 mysql set autocommit 0 mysql select from innodb...