MYSQL中的那些鎖

2021-08-17 05:11:31 字數 2795 閱讀 3320

在電腦科學中,鎖是在執行多執行緒時用於強行限制資源訪問的同步機制,即用於在併發控制中保證對互斥要求的滿足。

在資料庫的鎖機制中介紹過,在dbms中,可以按照鎖的粒度把資料庫鎖分為行級鎖(innodb引擎)、表級鎖(myisam引擎)和頁級鎖(bdb引擎 )。

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

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

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

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

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

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

myisam和memory採用表級鎖(table-level locking)

bdb採用頁面鎖(page-level locking)或表級鎖,預設為頁面鎖

innodb支援行級鎖(row-level locking)和表級鎖,預設為行級鎖

前面提到過,在innodb引擎中既支援行鎖也支援表鎖,那麼什麼時候會鎖住整張表,什麼時候或只鎖住一行呢?

innodb行鎖是通過給索引上的索引項加鎖來實現的,這一點mysql與oracle不同,後者是通過在資料塊中對相應資料行加鎖來實現的。innodb這種行鎖實現特點意味著:只有通過索引條件檢索資料,innodb才使用行級鎖,否則,innodb將使用表鎖!

在實際應用中,要特別注意innodb行鎖的這一特性,不然的話,可能導致大量的鎖衝突,從而影響併發效能。

myisam中是不會產生死鎖的,因為myisam總是一次性獲得所需的全部鎖,要麼全部滿足,要麼全部等待。而在innodb中,鎖是逐步獲得的,就造成了死鎖的可能。

在mysql中,行級鎖並不是直接鎖記錄,而是鎖索引。索引分為主鍵索引和非主鍵索引兩種,如果一條sql語句操作了主鍵索引,mysql就會鎖定這條主鍵索引;如果一條語句操作了非主鍵索引,mysql會先鎖定該非主鍵索引,再鎖定相關的主鍵索引。 在update、delete操作時,mysql不僅鎖定where條件掃瞄過的所有索引記錄,而且會鎖定相鄰的鍵值,即所謂的next-key locking。

當兩個事務同時執行,乙個鎖住了主鍵索引,在等待其他相關索引。另乙個鎖定了非主鍵索引,在等待主鍵索引。這樣就會發生死鎖。

發生死鎖後,innodb一般都可以檢測到,並使乙個事務釋放鎖回退,另乙個獲取鎖完成事務。

有多種方法可以避免死鎖,這裡只介紹常見的三種

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

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

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

行級鎖是mysql中鎖定粒度最細的一種鎖,行級鎖能大大減少資料庫操作的衝突。行級鎖分為共享鎖和排他鎖兩種,本文將詳細介紹共享鎖及排他鎖的概念、使用方式及注意事項等。

共享鎖又稱讀鎖,是讀取操作建立的鎖。其他使用者可以併發讀取資料,但任何事務都不能對資料進行修改(獲取資料上的排他鎖),直到已釋放所有共享鎖。

如果事務t對資料a加上共享鎖後,則其他事務只能對a再加共享鎖,不能加排他鎖。獲准共享鎖的事務只能讀資料,不能修改資料。

select ... lock in share mode;

在查詢語句後面增加lock in share mode,mysql會對查詢結果中的每行都加共享鎖,當沒有其他執行緒對查詢結果集中的任何一行使用排他鎖時,可以成功申請共享鎖,否則會被阻塞。其他執行緒也可以讀取使用了共享鎖的表,而且這些執行緒讀取的是同乙個版本的資料。

排他鎖又稱寫鎖,如果事務t對資料a加上排他鎖後,則其他事務不能再對a加任任何型別的封鎖。獲准排他鎖的事務既能讀資料,又能修改資料。

select ... for update;

在查詢語句後面增加for update,mysql會對查詢結果中的每行都加排他鎖,當沒有其他執行緒對查詢結果集中的任何一行使用排他鎖時,可以成功申請排他鎖,否則會被阻塞。

意向共享鎖(is):表示事務準備給資料行加入共享鎖,也就是說乙個資料行加共享鎖前必須先取得該錶的is鎖

意向排他鎖(ix):類似上面,表示事務準備給資料行加入排他鎖,說明事務在乙個資料行加排他鎖前必須先取得該錶的ix鎖。

意向鎖是innodb自動加的,不需要使用者干預。

對於insert、update、delete,innodb會自動給涉及的資料加排他鎖(x);對於一般的select語句,innodb不會加任何鎖,事務可以通過以下語句給顯示加共享鎖或排他鎖。

共享鎖:select ... lock in share mode;

排他鎖:select ... for update;

Mysql中那些鎖機制之InnoDB

我們知道mysql在以前,儲存引擎預設是myisam,但是隨著對事務和併發的要求越來越高,便引入了innodb引擎,它具有支援事務安全等一系列特性。innodb實現了兩種型別的行鎖。共享鎖 s 允許乙個事務去讀一行,阻止其他事務獲得相同的資料集的排他鎖。排他鎖 x 允許獲得排他鎖的事務更新資料,但是...

mysql中鎖的概念 mysql中的鎖機制之概念篇

鎖的概念 鎖,在現實生活中是為我們想要隱藏於外界所使用的一種工具。在計算機中,是協調多個程序或執行緒併發訪問某一資源的一種機制。在資料庫當中,除了傳統的計算資源 cpu ram i o等等 的爭用之外,資料也是一種供許多使用者共享訪問的資源。如何保證資料併發訪問的一致性 有效性,是所有資料庫必須解決...

mysql a鎖 MYSQL中的鎖

前言 剛開始接觸mysql,對其鎖機制並不了解,在專案裡面,針對死鎖以及鎖競爭,約定了兩條規則。對涉及多個業務表的更新,要遵守一定的順序,如按照table a,table b,table c的次序 對乙個業務表的更新,要先排序,按順序執行更新操作。下面就在mysql中對一些場景進行演示。死鎖死鎖產生...