mysql中表鎖和行鎖有什么區別

mysql中表鎖和行鎖的區別是:1、表鎖偏向myisam存儲引擎,行鎖偏向innodb存儲引擎;2、表鎖開銷小,行鎖開銷大;3、表鎖的鎖粒度大,行鎖的鎖粒度小。

mysql中表鎖和行鎖有什么區別

本篇文章將對MySQL的表鎖和行鎖進行詳細介紹,以及分析對比之間的區別,希望對大家起到參考作用。

(視頻教程推薦:mysql視頻教程

一、表鎖

?特點:偏向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執行過程中通過過范圍查找的話,他會鎖定整個范圍內所有的索引鍵值,即使這個鍵值并不存在。

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

優化建議:

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

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

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

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

盡可能低級別事務隔離

以上就是

? 版權聲明
THE END
喜歡就支持一下吧
點贊6 分享