MySQL資料庫(十) 鎖

2021-09-25 09:41:49 字數 2191 閱讀 6865

當資料庫有併發事務的時候,可能會產生資料不一致,這時候需要一些機制來保證訪問次序,鎖機制就是這樣的乙個機制。

在readuncommitted級別下,讀取資料不需要加共享鎖,這樣就不會和被修改的資料上的排他鎖衝突。

在readcommitted級別下,讀操作需要加共享鎖,但是在語句執行完之後釋放共享鎖。

在repeatableread級別下,讀操作需要加共享鎖,但是在事務提交之前並不釋放共享鎖,即在事務執行完畢以後才釋放共享鎖。

serializable是限制性最強的隔離級別,因為該級別鎖定整個範圍的鍵,並一直持有鎖,直到事務完成。

在關係型資料庫中可以按照鎖的粒度把資料庫鎖分為行級鎖(innodb引擎)、表級鎖(myisam引擎)和頁級鎖(bdb引擎)。

行級鎖是mysql中鎖定粒度最細的一種鎖,只針對當前操作的行進行加鎖。行級鎖能大大減少資料庫操作的衝突,加鎖粒度最小,單加鎖的開銷也最大。行級鎖分為共享鎖和排他鎖。

特點:開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖衝突的概率最低,併發度最高。

表級鎖是mysql中鎖定粒度最大的一種鎖,表示對當前操作的整張表加鎖。實現簡單,資源消耗較少,被大部分mysql引擎支援。最常使用的myisam和innodb都支援表級鎖定。表級鎖分為表共享鎖(共享鎖)和表獨佔寫鎖(排他鎖)。

特點:開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發出鎖衝突的概率最高,併發度低。

頁級鎖是mysql中鎖定粒度介於行鎖和表鎖中間的一種鎖。表鎖速度快但衝突多,行鎖衝突少但速度慢,所以取了折中的頁級,一次鎖定相鄰的一組記錄。

特點:開銷和加鎖時間界於表鎖和行鎖之間;會出現死鎖;鎖定粒度介於表鎖和行鎖之間,併發度一般。

表鎖:開銷小、加鎖快、不會出現死鎖、鎖粒度較大、發生鎖衝突的概率比較大。

行鎖:開銷大、加鎖慢、會出現死鎖、鎖粒度較小、發生鎖衝突的概率較小。

頁鎖:開銷和加鎖時間界於表鎖和行鎖之間;會出現死鎖;鎖定粒度介於表鎖和行鎖之間,併發度一般。

從鎖的類別上來講,有共享鎖和排他鎖。

共享鎖,又叫做讀鎖。當使用者要進行資料的讀取時,對資料加上共享鎖。共享鎖可以同時加上多個。

排他鎖就叫做寫鎖。當使用者要進行資料的寫入時對資料加上排他鎖,排他鎖只可以加乙個,和其他的共享鎖、排他鎖都相斥。

innodb是基於索引來完成行鎖

例如select * from tab_with_index where id = 1 for update;

for tpdate可以根據條件來完成行鎖鎖定,並且id是有索引鍵的列,如果id不是索引鍵,那麼innodb將完成表鎖。

record lock:單個行記錄上的鎖

gap lock:間隙鎖,鎖定乙個範圍,不包括記錄本身。

next-key lock:record+gap鎖定乙個範圍,包含記錄本身。

innodb對於行的查詢使用next-key lock。

next-locking keying為了解決phantom problem幻讀問題。

當查詢的索引含有唯一屬性時,將next-key lock降級為record key。

gap鎖設計的目的是為了阻止多個事務將記錄插入到同一範圍內,這會導致幻讀問題的產生。

有兩種方式顯式關閉gap鎖:除了外來鍵約束和唯一性檢查外,其餘情況僅使用record lock

a、將事務隔離級別設定為rc。

b、將引數innodb_locks_unsafe_for_binlog設定為1。

死鎖是指兩個或多個事務在同一資源上相互占用,並請求鎖定對方的資源,從而導致惡性迴圈的現象。

如果不同程式會併發訪問多個表,盡量約定以相同的順序訪問表,可以大大降低死鎖機會。

在同乙個事務中,盡可能做到一次鎖定所需要的所有資源,減少死鎖產生概率。

對於非常容易產生死鎖的業務部分,可以嘗試使用公升級鎖定粒度,通過表級鎖來減少死鎖產生的概率。

如果業務處理不好,可以使用分布式事務鎖或者樂觀鎖。

資料庫管理系統(dbms)中的併發控制的任務是,確保在多個事務同時訪問資料庫中同一資料時,不破壞事務的隔離性和統一性以及資料庫的統一性。樂觀鎖和悲觀鎖是兩種主要的技術手段。

實現方式:使用資料庫中的鎖機制。

實現方式:一般使用版本號控制或者cas演算法實現。

樂觀鎖適用於寫比較少的情況下(多讀場景)。即衝突真的很少發生的時候,這樣可以省去鎖的開銷,加大系統的吞吐量。

但如果是多寫的情況,一般會經常產生衝突,這樣會導致上層應用會不斷的進行retry,這樣反而降低效能,所以在多寫的場景下使用悲觀鎖比較合適。

mysql資料庫鎖 MySQL資料庫的鎖機制

在併發訪問情況下,很有可能出現不可重複讀等等讀現象。為了更好的應對高併發,封鎖 時間戳 樂觀併發控制 樂觀鎖 悲觀併發控制 悲觀鎖 都是併發控制採用的主要技術方式。鎖分類 按操作劃分 dml鎖,ddl鎖 按鎖的粒度劃分 表級鎖 行級鎖 頁級鎖 按鎖級別劃分 共享鎖 排他鎖 按加鎖方式劃分 自動鎖 顯...

mysql資料庫鎖

表鎖 讀鎖會阻塞寫,但是不會阻塞讀操作。而寫鎖則會把讀和寫都阻塞 myisam索引結構 myisam索引用的b tree來儲存資料,myisam索引的指標指向的是鍵值的位址,位址儲存的是資料。b tree的資料域儲存的內容為實際資料的位址,也就是說它的索引和實際的資料是分開的,只不過是用索引指向了實...

MySQL資料庫鎖

mysql鎖分為表級鎖 頁級鎖和行級鎖。innodb 行級鎖 在特殊情況下會公升級為表級鎖,如給沒有加索引的非唯一字段加鎖,或者在普通索引中,使用模糊查詢使索引失效,導致加鎖時,公升級為表鎖 myisam 表級鎖 排他鎖又稱為寫鎖,乙個事務在一行資料加上排他鎖後,其他事務不能再在其上加其他的鎖,也修...