MySQL的表鎖和行鎖

2021-10-17 12:06:07 字數 1671 閱讀 2564

特點:偏向myisam儲存引擎,開銷小,加鎖快;無死鎖;鎖定粒度大,發生鎖衝突的概率最高,併發度最低。

我們在編輯表,或者執行修改表的事情了語句的時候,一般都會給表加上表鎖,可以避免一些不同步的事情出現,表鎖分為兩種,一種是讀鎖,一種是寫鎖。

我們可以手動給表加上這兩種鎖,語句是:lock table 表名 read(write);

釋放所有表的鎖:unlock tables;

檢視加鎖的表:show open tables;

加讀鎖(共享鎖):

我們給表加上讀鎖會有什麼效果呢?

1、我們加讀鎖的這個程序可以讀加讀鎖的表,但是不能讀其他的表。

2、加讀鎖的這個程序不能update加讀鎖的表。

3、其他程序可以讀加讀鎖的表(因為是共享鎖),也可以讀其他表

4、其他程序update加讀鎖的表會一直處於等待鎖的狀態,直到鎖被釋放後才會update成功。

加寫鎖(獨佔鎖):

1、加鎖程序可以對加鎖的表做任何操作(curd)。

2、其他程序則不能查詢加鎖的表,需等待鎖釋放

總結: 讀鎖會阻塞寫,但是不會堵塞讀。而寫鎖則會把讀和寫都堵塞。(特別注意程序)分析:show status like 『table%』;

table_locks_immediate:產生表級鎖定的次數,表示可以立即獲取鎖的查詢次數,每立即獲取鎖值加1 。

table_locks_waited:出現表級鎖定爭用而發生等待的次數(不能立即獲取鎖的次數,每等待一次鎖值加1),此值高則說明存在著較嚴重的表級鎖爭用情況。

**特點:**偏向innodb儲存引擎,開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖衝突的概率最低,併發度也最高。

行鎖支援事務,所以 有關事務的知識下篇部落格再總結。

**行為:**

1、當我們對一行進行更新但是不提交的時候,其他程序也對該行進行更新則需要進行等待,這就是行鎖。

2、如果我們對一行進行更新,其他程序更新別的行是不會受影響的。

行鎖公升級為表鎖:當我們的行鎖涉及到索引失效的時候,會觸發表鎖的行為。

間隙鎖:

當我們用範圍條件而不是相等條件檢索資料,並請求共享或排他鎖時,innodb會給符合條件的已有資料記錄的索引項加鎖;對於鍵值在條件範圍內但並不存在的記錄,叫做「間隙(gap)」,innodb也會對這個「間隙」加鎖,這種鎖機制就是所謂的間隙鎖(next-key鎖)。

因為query執行過程中通過過範圍查詢的話,他會鎖定整個範圍內所有的索引鍵值,即使這個鍵值並不存在。

間隙鎖有乙個比較致命的弱點,就是當鎖定乙個範圍鍵值之後,即使某些不存在的鍵值也會被無辜的鎖定,而造成在鎖定的時候無法插入鎖定鍵值範圍內的任何資料。在某些場景下這可能會對效能造成很大的危害

優化建議:

mysql行鎖表鎖區別 mysql表鎖和行鎖區別

一 表鎖 特點 偏向myisam儲存引擎,開銷小,加鎖快 無死鎖 鎖定粒度大,發生鎖衝突的概率最高,併發度最低。我們在編輯表,或者執行修改表的事情了語句的時候,一般都會給表加上表鎖,可以避免一些不同步的事情出現,表鎖分為兩種,一種是讀鎖,一種是寫鎖。我們可以手動給表加上這兩種鎖,語句是 lock t...

mysql行鎖和表鎖

在呼叫儲存過程中,就會涉及到表鎖,行鎖這一概念 所謂區別 有索引的時候就是行鎖,沒有索引的時候就是表索。innodb 的行鎖是在有索引的情況下,沒有索引的表是鎖定全表的.表鎖演示 無索引 session1 mysql set autocommit 0 mysql select from innodb...

mysql行鎖和表鎖

在呼叫儲存過程中,就會涉及到表鎖,行鎖這一概念 所謂區別 有索引的時候就是行鎖,沒有索引的時候就是表索。innodb 的行鎖是在有索引的情況下,沒有索引的表是鎖定全表的.表鎖演示 無索引 session1 mysql set autocommit 0 mysql select from innodb...