Mysql的鎖機制之表鎖

2021-09-20 09:12:48 字數 2658 閱讀 1661

在資料庫中,除傳統的計算資源(如cpu,ram,i/o等)的爭用外,資料也是一種供許多使用者共享的資源,如何保證資料併發訪問的一致性,有效性是所有資料庫必須解決的乙個問題,鎖衝突也是影響資料庫併發訪問效能的乙個重要因素.從這個角度來說,鎖對資料庫而言現得尤其重要,也更加複雜.

按照對資料庫的操作分為讀鎖和寫鎖

讀鎖(共享鎖):針對同乙份資料,多個讀操作可以同時進行而不會互相影響.

寫鎖(排他鎖):當前寫操作沒有完成前,它會阻斷其他寫鎖和讀鎖.

按對資料操作的粒度分為表鎖和行鎖。

表鎖:開銷小,加鎖快;不會出現死鎖;鎖定力度大,發生鎖衝突概率高,併發度最低

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

頁鎖:開銷和加鎖速度介於表鎖和行鎖之間;會出現死鎖;鎖定粒度介於表鎖和行鎖之間,併發度一般

locktable 表名字 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 也...