鎖是我們在計算機中經常用來解決多個程序或執行緒併發訪問臨界資源的一種控制方法。
在資料庫中資料也是我們臨界資源的的一種,所以我們要保證在多程序、多執行緒的併發訪問中資料的一致性和有效性。
mysql的三種鎖機制:
1、表級鎖:開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發生所衝突的概率最高,併發度最低
2、行級鎖:開銷大,加鎖慢;會出現死鎖;鎖粒度最小,發生鎖衝突的概率最小,併發度最高
3、頁級鎖:開銷和加鎖時間在表級鎖和行級鎖之間;會出現死鎖;鎖定粒度位於表鎖和行鎖之間,併發度一般
關於三種鎖機制的選用
要根據實際實現的業務去選擇,表級鎖適合以查詢為主的業務,只有少量按索引條件去更新資料的應用;
行級鎖適合有大量併發按索引去更新少量資料的操作
myisam儲存殷勤只支援表鎖
查詢表級鎖的爭用
如果table_locks_waited的值比較高,則說明有較為嚴重的表級鎖爭用
mysql表級鎖的鎖模式
請求鎖模式
是否相容
當前鎖模式
none
讀鎖寫鎖讀鎖是
是否寫鎖是
否否由**中可以看出:myisam對於讀操作,它不會去阻塞其他使用者對於同一張表的讀,但會阻塞其他使用者的寫。對於寫操作,則其他使用者的讀寫都會被阻塞。所以表級鎖模式下,讀與寫、寫與寫操作是序列的。
加表鎖
myisam在執行查詢語句前會給涉及的表加上乙個讀鎖,在執行更新操作的時候會給涉及到的表加上寫鎖。
給myisam顯示加上鎖一般是為了模擬事務的操作,當有多條sql要執行時涉及多張表,這個時候執行到後面的時候表裡的資料可能會發生改變,這個時候為了保證資料的一致性,我們會給多條sql統一加鎖。
ps:對錶加鎖,但是通過別名來訪問時會出現錯誤,需要分別對別名進行鎖定
lock table tablename as alias read | write
myisam的鎖排程
在myisam中讀寫操作是互斥的,mysql中兩個請求之間,預設是寫請求的優先順序大於讀請求,所以當有大量更新操作是,極為容易造成一直阻塞的現象,這個時候我們往往要自己去定義讀寫的優先順序。
1、通過指定啟動引數low-priority-updates,使得myisam引擎預設給予讀請求以優先的權力
2、通過執行命令set low_priority_updates=1,使得該連線發出的更新請求優先順序降低
3、通過指定insert,update,delete語句的low_priority屬性,來降低語句的優先順序
4、給系統引數max_write_lock_count設定乙個合適的值,當表的讀鎖達到一定數量的時候mysql就會暫時將寫請求的優先順序降低
mysql鎖的問題
鎖表的問題 innodb鎖表問題 死鎖的形成 向innodb資料表中寫資料死鎖。蒐集資料如下 一 形成死鎖的四個必要條件 1 互斥條件 乙個資源每次只能被乙個程序使用。2 請求與保持條件 乙個程序因請求資源而阻塞時,對已獲得的資源保持不放。3 不剝奪條件 程序已獲得的資源,在末使用完之前,不能強行剝...
理解mysql鎖(1)鎖的概述
相對其他資料庫而言,mysql的鎖機制比較簡單 其最顯著的特點是不同的儲存引擎支援不同的鎖機制 但總的來說,mysql各種儲存引擎使用了三種型別的鎖定機制 行級鎖定 頁級鎖定和表級鎖定 其中,myisam主要使用表級鎖定,而使用行級鎖定的主要是innodb。表級鎖 開銷小,加鎖快 不會出現死鎖 鎖定...
理解mysql鎖(1)鎖的概述
相對其他資料庫而言,mysql的鎖機制比較簡單 其最顯著的特點是不同的儲存引擎支援不同的鎖機制 但總的來說,mysql各種儲存引擎使用了三種型別的鎖定機制 行級鎖定 頁級鎖定和表級鎖定 其中,myisam主要使用表級鎖定,而使用行級鎖定的主要是innodb。表級鎖 開銷小,加鎖快 不會出現死鎖 鎖定...