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

2021-10-17 15:26:48 字數 1803 閱讀 2454

一、表鎖

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

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

我們可以手動給表加上這兩種鎖,語句是:

lock table 表名 read(write);

釋放所有表的鎖:

unlock tables;

檢視加鎖的表:

show open tables;

加讀鎖(共享鎖):

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

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

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

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

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

加寫鎖(獨佔鎖):

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

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

總結:讀鎖會阻塞寫,但是不會堵塞讀。而寫鎖則會把讀和寫都堵塞。(特別注意程序)

分析:show status like 'table%';

輸入上述命令,可得:

| variable_name | value |

| table_locks_immediate | 105 |

| table_locks_waited | 3 |

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

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

二、行鎖

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

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

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

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

行鎖公升級為表鎖:

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

正常情況,各自鎖定各自的行,互相不影響,乙個2000另乙個3000

由於在column欄位b上面建了索引,如果沒有正常使用,會導致行鎖變表鎖

比如沒加單引號導致索引失效,行鎖變表鎖

被阻塞,等待。只到session_1提交後才阻塞解除,完成更新

所以,由此,我們還是要善用索引查詢啊。

間隙鎖:

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

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

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

優化建議:

盡可能讓所有資料檢索都通過索引來完成,避免無索引行鎖公升級為表鎖。

合理設計索引,盡量縮小鎖的範圍

盡可能較少檢索條件,避免間隙鎖

盡量控制事務大小,減少鎖定資源量和時間長度

Mysql行鎖與表鎖的區別

mysql有關許可權的表都有哪幾個 mysql伺服器通過許可權表來控制使用者對資料庫的訪問,許可權表存放在mysql資料庫裡,由mysql install db指令碼初始化。這些許可權表分別user,db,table priv,columns priv和host。下面分別介紹一下這些表的結構和內容 ...

MYSQL 表級鎖 行級鎖 頁面鎖區別

myisam儲存引擎預設是表級鎖 innodb儲存引擎預設是行級鎖 dbd儲存引擎預設是頁面鎖 表級鎖 開銷小,加鎖快 不會出現死鎖 鎖定粒度大,發出鎖衝突的概率最高,併發度最低。行級鎖 開鎖大,加鎖慢 會出現死鎖 鎖定粒度最小,發生鎖衝突的概率最低,併發度也最高。頁面鎖 開銷和加鎖時間界於表鎖和行...

MySQL 表鎖 行鎖 間隙鎖

表鎖 表鎖有兩種模式 表共享讀鎖 表獨佔寫鎖 表共享讀鎖 讀鎖不會阻塞其他程序對同一表的讀操作,但阻塞寫操作,只有釋放鎖後其他程序才可以寫 表獨佔寫鎖 寫鎖會阻塞其他程序對同一表的讀和寫,只有寫鎖釋放後,其他程序才可以讀寫 簡而言之 讀鎖會阻塞寫,不阻塞讀 寫鎖阻塞讀和寫。行鎖 只鎖住某一行或多行的...