您好,登錄后才能下訂單哦!
小編給大家分享一下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執行過程中通過過范圍查找的話,他會鎖定整個范圍內所有的索引鍵值,即使這個鍵值并不存在。
間隙鎖有一個比較致命的弱點,就是當鎖定一個范圍鍵值之后,即使某些不存在的鍵值也會被無辜的鎖定,而造成在鎖定的時候無法插入鎖定鍵值范圍內的任何數據。在某些場景下這可能會對性能造成很大的危害
優化建議:
盡可能讓所有數據檢索都通過索引來完成,避免無索引行鎖升級為表鎖。
合理設計索引,盡量縮小鎖的范圍
盡可能較少檢索條件,避免間隙鎖
盡量控制事務大小,減少鎖定資源量和時間長度
盡可能低級別事務隔離
以上是mysql表鎖和行鎖區別是什么的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。