在電腦科學中,鎖是在執行多執行緒時用於強行限制資源訪問的同步機制,即用於在併發控制中保證對互斥要求的滿足。
在資料庫的dbms中,可以按照鎖的粒度把資料庫鎖分為行級鎖(innodb引擎)、表級鎖(myisam引擎)和頁級鎖(bdb引擎 )。
行級鎖是mysql中鎖定粒度最細的一種鎖,表示只針對當前操作的行進行加鎖。行級鎖能大大減少資料庫操作的衝突。其加鎖粒度最小,但加鎖的開銷也最大。行級鎖分為共享鎖和排它鎖
(mysql中的共享鎖與排他鎖)
開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖衝突的概率最低,併發度也最高。
表級鎖是mysql中鎖定粒度最大的一種鎖,表示對當前操作的整張表加鎖,它實現簡單,資源消耗較少,被大部分mysql引擎支援。最常使用的myisam與innodb都支援表級鎖定。表級鎖定分為表共享鎖(共享鎖)和表獨佔鎖(排它鎖)(mysql中的共享鎖與排他鎖)
開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發出鎖衝突的概率最高,併發度最低。
頁級鎖是mysql中鎖定粒度介於行級鎖和表級鎖中間的一種鎖。表級鎖速度快,但衝突多,行級衝突少,但速度慢。所以取了折衷的頁級,一次鎖定相鄰的一組記錄。bdb支援頁級鎖
開銷和加鎖時間界於表鎖和行鎖之間;會出現死鎖;鎖定粒度界於表鎖和行鎖之間,併發度一般
myisam和memory採用表級鎖(table-level locking)前面提到過,在innodb引擎中既支援行鎖也支援表鎖,那麼什麼時候會鎖住整張表,什麼時候或只鎖住一行呢?bdb採用頁面鎖(page-level locking)或表級鎖,預設為頁面鎖
innodb支援行級鎖(row-level locking)和表級鎖,預設為行級鎖
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行級鎖 表級鎖 頁級鎖
mysql資料庫由於其自身架構的特點,存在多種資料儲存引擎,每種儲存引擎所針對的應用場景特點都不太一樣,為了滿足各自特定應用場景的需求,每種儲存引擎的鎖定機制都是為各自所面對的特定場景而優化設計,所以各儲存引擎的鎖定機制也有較大區別。mysql各儲存引擎使用了三種型別 級別 的鎖定機制 表級鎖定,行...
MySQL中的行級鎖 表級鎖 頁級鎖
在電腦科學中,鎖是在執行多執行緒時用於強行限制資源訪問的同步機制,即用於在併發控制中保證對互斥要求的滿足。在dbms中,可以按照鎖的粒度把資料庫鎖分為行級鎖 innodb引擎 表級鎖 myisam引擎 和頁級鎖 bdb引擎 一 行級鎖 行級鎖是mysql中鎖定粒度最細的一種鎖,表示只針對當前操作的行...
MySQL中的行級鎖,表級鎖,頁級鎖
在電腦科學中,鎖是在執行多執行緒時用於強行限制資源訪問的同步機制,即用於在併發控制中保證對互斥要求的滿足。在資料庫的鎖機制中介紹過,在dbms中,可以按照鎖的粒度把資料庫鎖分為行級鎖 innodb引擎 表級鎖 myisam引擎 和頁級鎖 bdb引擎 行級鎖是mysql中鎖定粒度最細的一種鎖,表示只針...