在資料庫中,除傳統的計算資源(如cpu,ram,i/o等)的爭用外,資料也是一種供許多使用者共享的資源,如何保證資料併發訪問的一致性,有效性是所有資料庫必須解決的乙個問題,鎖衝突也是影響資料庫併發訪問效能的乙個重要因素.從這個角度來說,鎖對資料庫而言現得尤其重要,也更加複雜.
按照對資料庫的操作分為讀鎖和寫鎖
讀鎖(共享鎖):針對同乙份資料,多個讀操作可以同時進行而不會互相影響.
寫鎖(排他鎖):當前寫操作沒有完成前,它會阻斷其他寫鎖和讀鎖.
按對資料操作的粒度分為表鎖和行鎖。
表鎖:開銷小,加鎖快;不會出現死鎖;鎖定力度大,發生鎖衝突概率高,併發度最低
行鎖:開銷大,加鎖慢;會出現死鎖;鎖定粒度小,發生鎖衝突的概率低,併發度高
頁鎖:開銷和加鎖速度介於表鎖和行鎖之間;會出現死鎖;鎖定粒度介於表鎖和行鎖之間,併發度一般
lock
table 表名字 read(write),表名字2
read(write);
檢視表上加過的鎖.
show
open
tables;
myisam儲存引擎只支援表鎖,新建book表,儲存引擎為myisam.
為book表新增寫鎖;
myisam在執行查詢語句之前,會自動給涉及的所有表加讀鎖,在執行增刪改操作前,會自動給涉及的表加寫鎖.
mysql的表級鎖有兩種模式:
表共享讀鎖(table read lock)
表獨佔寫鎖(table write lock)
鎖型別可否相容
讀鎖讀鎖讀鎖是
是是寫鎖是
否否結論:對myisam表進行操作,會有以下情況
1.對myisam表的讀操作(加讀鎖),不會阻塞其他程序對同意表的讀請求,但會阻塞對同一表的寫請求.只有當讀鎖釋放後,
才會執行其他程序的寫操作.
2,對myisam表的寫操作(加寫鎖),會阻塞其他程序對同一表的讀和寫操作,只有當寫鎖釋放後,才會執行其他程序的讀寫操作.
讀鎖會阻塞寫,但是不會阻塞讀。而寫鎖則會把讀和寫都阻塞.
看看哪些表被鎖了
show
open
tables;
分析表鎖定
table_locks_immediate 和table_locks_waited狀態變數記錄mysql內部表級鎖定的情況,
table_locks_immediate 產生表級鎖定的次數,表示可以立即獲取鎖的查詢次數,每次立即獲得則加1
table_locks_waited 出現表級鎖定爭用而發生等待的次數(不能立即獲取鎖的次數,沒等待一次鎖則加1),此值高則說明存在著較嚴重的表級鎖定爭用情況.
myisam的讀寫鎖排程是寫優先,這也是myisam不適合做寫為主表的引擎.因為寫鎖後,其他執行緒不能做任何操作,大量的更新會使查詢很難得到鎖,從而造成永遠阻塞.
如果 table_locks_immediate / table_locks_waited > 5000,最好採用innodb引擎,因為innodb是行鎖而myisam是表鎖,對於高併發寫入的應用innodb效果會好些.
鎖機制之MySQL表鎖
如何保證在被併發訪問時資料的一致性 完整性和有效性,是資料庫關注的核心問題。資料庫的鎖機制就是為了解決這個問題而出現的。鎖機制在一定程度上將對共享資源的併發訪問有序化,從而保證資料的一致完整性。鎖機制的好壞直接影響到資料的併發處理能力和效能。乙個好的鎖機制的實現是乙個資料的核心競爭力之一。我們知道在...
mysql鎖機制之表鎖 三
顧名思義,表鎖就是一鎖鎖一整張表,在表被鎖定期間,其他事務不能對該錶進行操作,必須等當前表的鎖被釋放後才能進行操作。表鎖響應的是非索引字段,即全表掃瞄,全表掃瞄時鎖定整張表,sql語句可以通過執行計畫看出掃瞄了多少條記錄。如何加表鎖 myisam 在執行查詢語句 select 前,會自動給涉及的所有...
mysql鎖機制 mysql 鎖機制
一 概述 mysql有三種鎖的級別 頁級 表級 行級。myisam和memory儲存引擎採用的是表級鎖 table level locking bdb儲存引擎採用的是頁面鎖 page level locking 但也支援表級鎖 innodb儲存引擎既支援行級鎖 row level locking 也...