mysql 行鎖與表鎖

2021-09-24 20:07:56 字數 1991 閱讀 3616

為日常整理,可能會有些重複.

行鎖表表鎖 : 

1> 多個事務操作同一行資料時,後來的事務處於阻塞等待狀態。這樣可以避免了髒讀等資料一致性的問題。後來的事務可以操作其他行資料,解決了表鎖高併發效能低的問題。

2> innodb的行鎖是針對索引加的鎖,不是針對記錄加的鎖。並且該索引不能失效,否則都會從行鎖公升級為表鎖。

3> 間隙鎖 :

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

危害(坑):若執行的條件是範圍過大,則innodb會將整個範圍內所有的索引鍵值全部鎖定,很容易對效能造成影響。

4> 排他鎖 :

排他鎖,也稱寫鎖,獨佔鎖,當前寫操作沒有完成前,它會阻斷其他寫鎖和讀鎖。

5> 共享鎖 :

共享鎖,也稱讀鎖,多用於判斷資料是否存在,多個讀操作可以同時進行而不會互相影響。當如果事務對讀鎖進行修改操作,很可能會造成死鎖。

行鎖優化 :

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

2> 盡可能避免間隙鎖帶來的效能下降,減少或使用合理的檢索範圍。

3> 盡可能減少事務的粒度,比如控制事務大小,而從減少鎖定資源量和時間長度,從而減少鎖的競爭等,提供效能。

4> 盡可能低級別事務隔離,隔離級別越高,併發的處理能力越低。

表鎖 :

表鎖的優勢:開銷小;加鎖快;無死鎖

表鎖的劣勢:鎖粒度大,發生鎖衝突的概率高,併發處理能力低

加鎖的方式:自動加鎖。查詢操作(select),會自動給涉及的所有表加讀鎖,更新操作(update、delete、insert),會自動給涉及的表加寫鎖。也可以顯示加鎖

共享讀鎖:lock table tablename read;

獨佔寫鎖:lock table tablename write;

批量解鎖:unlock tables;

共享讀鎖 : 對myisam表的讀操作(加讀鎖),不會阻塞其他程序對同一表的讀操作,但會阻塞對同一表的寫操作。只有當讀鎖釋放後,才能執行其他程序的寫操作。在鎖釋放前不能取其他表

獨佔寫鎖 : 對myisam表的寫操作(加寫鎖),會阻塞其他程序對同一表的讀和寫操作,只有當寫鎖釋放後,才會執行其他程序的讀寫操作。在鎖釋放前不能寫其他表

即便你在條件中使用了索引字段,mysql會根據自身的執行計畫,考慮是否使用索引(所以explain命令中會有possible_key 和 key)。如果mysql認為全表掃瞄效率更高,它就不會使用索引,這種情況下innodb將使用表鎖,而不是行鎖。因此,在分析鎖衝突時,別忘了檢查sql的執行計畫,以確認是否真正使用了索引。

第二種情況:多表查詢。事務涉及多個表,比較複雜的關聯查詢,很可能引起死鎖,造成大量事務回滾。這種情況若能一次性鎖定事務涉及的表,從而可以避免死鎖、減少資料庫因事務回滾帶來的開銷。

行鎖的劣勢:開銷大;加鎖慢;會出現死鎖

行鎖的優勢:鎖的粒度小,發生鎖衝突的概率低;處理併發的能力強

加鎖的方式:自動加鎖。對於update、delete和insert語句,innodb會自動給涉及資料集加排他鎖;對於普通select語句,innodb不會加任何鎖;當然我們也可以顯示的加鎖:

共享鎖:select * from tablename where … + lock in share more

排他鎖:select * from tablename where … + for update

innodb和myisam的最大不同點有兩個:

1> innodb支援事務(transaction)

2> 預設採用行級鎖。

for update :

1> 當for update的字段為索引或者主鍵的時候,只會鎖住索引或者主鍵對應的行。

2> 當for update的字段為普通欄位的時候,innodb會鎖住整張表。

Mysql行鎖與表鎖

用主鍵修改就是行瑣,或者用索引修改就是行瑣 update tab set name xx where id xx 行鎖 update tab set name xx where date 非主鍵或索引 xx 表鎖 插入的時候呢?插入都是行鎖 alert語句修改表結構,表鎖 表鎖和行鎖同時發生時,會等...

mysql的行鎖與表鎖

mysql 行鎖與表鎖 只根據主鍵進行查詢,並且查詢到資料,主鍵字段產生行鎖。begin select from table where id 1 for update commit 只根據主鍵進行查詢,沒有查詢到資料,不產生鎖。begin select from table where id 1 ...

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

一 表鎖 特點 偏向myisam儲存引擎,開銷小,加鎖快 無死鎖 鎖定粒度大,發生鎖衝突的概率最高,併發度最低。我們在編輯表,或者執行修改表的事情了語句的時候,一般都會給表加上表鎖,可以避免一些不同步的事情出現,表鎖分為兩種,一種是讀鎖,一種是寫鎖。我們可以手動給表加上這兩種鎖,語句是 lock t...