Mysql中的表鎖,行鎖,共享鎖,樂觀,悲觀鎖總結

2021-09-25 02:12:48 字數 1334 閱讀 5550

myisam 和memory儲存引擎採用的是表級鎖

innodb儲存引擎及支援行級鎖,也支援表級鎖,但預設情況下採用的是行級鎖。

mysql主要的兩種鎖的特性可大致歸納如下:

阿里p8架構師談:mysql 行鎖,表鎖,悲觀鎖,樂觀鎖的特定和應用

表級鎖:開銷小,加鎖塊,不會出現死鎖(因為myisam會一次性獲得sql所需的全部鎖);鎖定的粒度大,發生鎖衝突的概率最高,併發度最低。

行級鎖:開銷大,加鎖慢,會出現死鎖。鎖定粒度最小,發生鎖衝突的概率最低,併發度也最高。

頁鎖:開銷介於表鎖和行鎖中間:會出現死鎖;鎖定的粒度也介於表鎖和行鎖之間。併發度一般。

悲觀鎖和樂觀鎖

1)、悲觀鎖:顧名思義,就是很悲觀,每次拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖,這樣別人想拿這個資料就會block直到它拿到鎖。

傳統的關係型資料庫裡面就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。

2)、樂觀鎖:很樂觀,每次拿資料的時候都認為別人不會修改,所以不會上鎖,但是在更新的時候會判斷一下在此期間又沒別人更新過這個資料,可以使用版本號等機制。

樂觀鎖適用於多讀的應用型別,這樣可以提高吞吐量。像資料庫如果提供類似於write_condition機制的其實都是提供的樂觀鎖。

3)、悲觀鎖和樂觀鎖的區別

兩種鎖各有優缺點,樂觀鎖適用於寫比較少的情況下,即衝突真的很少發生的時候,這樣就可以省去鎖的開銷,加大了系統的整個吞吐量,但如果經常產生衝突,上層應用會不斷的進行retry,這樣反倒是降低了效能,所以這種情況下用悲觀鎖比較合適。

共享鎖共享鎖指的是對於多個不同的事務,對同乙個資源共享同乙個鎖。相當與同乙個門,擁有多個鑰匙一樣,就像這樣,你家有乙個大門,大門的鑰匙有好多把,你有一把,你女朋友有一把,你你們都可以通過這把鑰匙進入你家,這個就是所謂的共享鎖。

對於悲觀鎖,一般的資料庫已經實現了,共享鎖也屬於悲觀鎖的一種;共享鎖在mysql中是通過在執行命令的後面加lock in share mode 來表示對某些資源加上共享鎖了。

什麼時候使用表鎖?

對於 innodb 表,在絕大部分情況下都應該使用行級鎖,因為事務和行鎖往往是我們之所以 選擇 innodb 表的理由。但在個別特殊事務中,也可以考慮使用表級鎖。

第一種情況是:事務需要更新大部分或全部資料,表又比較大,如果使用預設的行鎖,不 僅這個事務執行效率低,而且可能造成其他事務長時間鎖等待和鎖衝突,這種情況下可以考 慮使用表鎖來提高該事務的執行速度。 第二種情況是:事務涉及多個表,比較複雜,很可能引起死鎖,造成大量事務回滾。這種 情況也可以考慮一次性鎖定事務涉及的表,從而避免死鎖、減少資料庫因事務回滾帶來的開 銷。 當然,應用中這兩種事務不能太多,否則,就應該考慮使用 myisam 表了。

Mysql中的表鎖 行鎖

行鎖 innodb行鎖是通過索引上的索引項來實現的,這一點 ysql與oracle不同,後者是通過在資料中對相應資料行加鎖來實現的。innodb這種行鎖實現特點意味者 只有通過索引條件檢索資料,innodb才會使用行級鎖,否則,innodb將使用表鎖。間隙鎖當用範圍條件而不是相等條件檢索資料,並請求...

MySQL 表鎖 行鎖 間隙鎖

表鎖 表鎖有兩種模式 表共享讀鎖 表獨佔寫鎖 表共享讀鎖 讀鎖不會阻塞其他程序對同一表的讀操作,但阻塞寫操作,只有釋放鎖後其他程序才可以寫 表獨佔寫鎖 寫鎖會阻塞其他程序對同一表的讀和寫,只有寫鎖釋放後,其他程序才可以讀寫 簡而言之 讀鎖會阻塞寫,不阻塞讀 寫鎖阻塞讀和寫。行鎖 只鎖住某一行或多行的...

MySQL的表鎖 行鎖

相對其他資料庫而言,mysql的鎖機制比較簡單,其最顯著的特點是不同的儲存引擎支援不同的鎖機制。mysql表級鎖有兩種模式 表共享讀鎖 table read lock 和表獨佔寫鎖 table write lock 對myisam的讀操作,不會阻塞其他使用者對同一表讀請求,但會阻塞對同一表的寫請求 ...