鎖是在執行多執行緒時用於強行限制資源訪問的同步機制,即用於在併發控制中保證對互斥要求的滿足
行級鎖:是mysql中鎖定粒度最細的一種鎖,表示只針對當前操作的行進行加鎖。行級鎖能大大減少資料庫操作的衝突。其加鎖粒度最小,但加鎖的開銷也最大。行級鎖分為共享鎖和排他鎖
特點:開銷大,加鎖慢,會出現死鎖;鎖定粒度最小,發生鎖衝突的概率最低,併發度最高
表級鎖:是mysql中鎖定粒度最大的一種鎖,表示對當前操作的整張表加鎖,它實現簡單,資源消耗較少,被大部分mysql引擎支援,表級鎖分為共享鎖與排他鎖
特點:開銷小,加鎖快,不會出現死鎖;鎖定粒度大,發出鎖衝突的概率最高,併發度最低
頁級鎖:是mysql中鎖定粒度結餘行級鎖和表級鎖中間的一種鎖。表級鎖速度快,但衝突多,行級鎖衝突少,但速度慢。所以取了折中的頁級,一次鎖定相鄰的一組記錄
innodb中的行鎖與表鎖
在innodb引擎中既支援行鎖也支援表鎖,那麼什麼時候回鎖住整張表,什麼時候只鎖住一行?
innodb行鎖是通過索引上的索引項加鎖來實現的,這一點mysql與oracle不同,後者是通過在資料塊中對相應資料航加鎖來是想的。innodb這種行鎖實現特點意味著,只有通過索引條件檢索資料,innodb才使用行級鎖,否則,innodv 講使用表鎖
在實際應用中,要特別注意innodb行鎖這一特性,不然,可能導致大量的鎖衝突,從而影響併發效能。
行級鎖都是基於索引的,如果一條sql語句用不到索引是不會使用行級鎖的,會使用表級鎖。行級鎖的缺點是:由於需要請求大量的鎖資源,所以速度慢,記憶體小寒大。
行級鎖與死鎖
在innodb中,鎖是逐步獲得的,就造成了死鎖的可能。
在mysql中,行級鎖並不是直接鎖記錄,而是所索引。索引分為主鍵索引和非主鍵索引兩種,如果一條slql語句操作了主鍵索引,沒有啥情況就會鎖定這條主鍵索引,如果一條語句操作了非主鍵索引,mysql會先鎖定非主鍵索引,在鎖定相關的主鍵索引。在update,delete操作是,mysql不僅鎖定where條件掃瞄過的所有索引記錄,而且會鎖定相鄰的鍵值。
當兩個事務同時執行,乙個鎖住了主鍵索引,在等待其他相關索引,另乙個鎖住了非主鍵索引,在等待主鍵索引。這樣就會發生死鎖
發生死鎖後,innodb一般都可以檢測到,並使乙個事務釋放所回退,另乙個獲取鎖完成事務
有多種方法可以避免死鎖,這裡只介紹常見的三種
1、如果不同程式會併發訪問多個表,盡量約定以相同的順序訪問表,可以大大降低死鎖機會。
2、在同乙個事務中,盡可能做到一次鎖定所需要的所有資源,減少死鎖產生概率;
3、對於非常容易產生死鎖的業務部分,可以嘗試使用公升級鎖定顆粒度,通過表級鎖定來減少死鎖產生的概率;
MySQL行級鎖 表級鎖 頁級鎖
mysql資料庫由於其自身架構的特點,存在多種資料儲存引擎,每種儲存引擎所針對的應用場景特點都不太一樣,為了滿足各自特定應用場景的需求,每種儲存引擎的鎖定機制都是為各自所面對的特定場景而優化設計,所以各儲存引擎的鎖定機制也有較大區別。mysql各儲存引擎使用了三種型別 級別 的鎖定機制 表級鎖定,行...
mysql行級鎖 頁級鎖和表級鎖
mysql的鎖是由具體的儲存引擎實現的。所以像mysql的預設引擎myisam和第三方外掛程式引擎 innodb的鎖實現機制是有區別的。1.表級鎖定 table level 表級別的鎖定是mysql各儲存引擎中最大顆粒度的鎖定機制。該鎖定機制最大的特點是實現邏輯非常簡單,帶來的系統負面影響最小。所以...
MySQL中的行級鎖,表級鎖,頁級鎖
在電腦科學中,鎖是在執行多執行緒時用於強行限制資源訪問的同步機制,即用於在併發控制中保證對互斥要求的滿足。在資料庫的dbms中,可以按照鎖的粒度把資料庫鎖分為行級鎖 innodb引擎 表級鎖 myisam引擎 和頁級鎖 bdb引擎 行級鎖是mysql中鎖定粒度最細的一種鎖,表示只針對當前操作的行進行...