首頁 > 資料庫 > mysql教程 > mysql中表鎖和行鎖有什麼差別

mysql中表鎖和行鎖有什麼差別

(*-*)浩
發布: 2020-10-13 10:14:51
原創
18217 人瀏覽過

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執行過程中經過範圍來尋找的話,他會鎖定整個範圍內所有的索引鍵值,即使這個鍵值並不存在。


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


優化建議:


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

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

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

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

盡可能低階交易隔離###

以上是mysql中表鎖和行鎖有什麼差別的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板