mysql中表鎖和行鎖的區別是:1、表鎖偏向myisam儲存引擎,行鎖偏向innodb儲存引擎;2、表鎖開銷小,行鎖開銷大;3、表鎖的鎖粒度大,行鎖的鎖粒度小。
這篇文章將對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 | +----------------------------+----------+
二、行鎖
特點:偏向InnoDB儲存引擎,開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖定衝突的機率最低,並發度也最高。
行鎖定支援事務,所以 有關事務的知識下篇部落格再總結。
行為:
1、當我們對一行進行更新但是不提交的時候,其他進程也對該行進行更新則需要等待,這就是行鎖。
2、如果我們對一行進行更新,其他行程更新別的行是不會受影響的。
行鎖定升級為表鎖:
當我們的行鎖涉及到索引失效的時候,會觸發表鎖的行為。
被封鎖,等待。只到Session_1提交後才阻塞解除,完成更新
所以,由此,我們還是要善用索引查詢啊。
間隙鎖定:
因為Query執行過程中經過範圍來尋找的話,他會鎖定整個範圍內所有的索引鍵值,即使這個鍵值並不存在。
間隙鎖有一個比較致命的弱點,就是當鎖定一個範圍鍵值之後,即使某些不存在的鍵值也會被無辜的鎖定,而造成在鎖定的時候無法插入鎖定鍵值範圍內的任何資料。在某些場景下這可能會對效能造成很大的危害
優化建議:
盡可能讓所有資料檢索都透過索引來完成,避免無索引行鎖升級為表鎖。
以上是mysql中表鎖和行鎖有什麼差別的詳細內容。更多資訊請關注PHP中文網其他相關文章!