MySQL----表鎖和行鎖和死鎖


行鎖

  走索引進行行鎖

表鎖

解決:對更新字段建立索引(唯一),當走索引只會進行行鎖;

當一條更新語句沒有走索引,可能就會進行表鎖,此時其他事物無論更新和插入都會等待

update f set name=20 where num=2;

死鎖

MySQL有三種鎖的級別:頁級、表級、行級。

  • 表級鎖:開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發生鎖沖突的概率最高,並發度最低。

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

  • 頁面鎖:開銷和加鎖時間界於表鎖和行鎖之間;會出現死鎖;鎖定粒度界於表鎖和行鎖之間,並發度一般

算法:

  • next KeyLocks鎖,同時鎖住記錄(數據),並且鎖住記錄前面的Gap   

  • Gap鎖,不鎖記錄,僅僅記錄前面的Gap

  • Recordlock鎖(鎖數據,不鎖Gap)

  • 所以其實 Next-KeyLocks=Gap鎖+ Recordlock鎖

  所謂死鎖<DeadLock>:是指兩個或兩個以上的進程在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去.此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的進程稱為死鎖進程。表級鎖不會產生死鎖.所以解決死鎖主要還是針對於最常用的InnoDB。

  死鎖的關鍵在於:兩個(或以上)的Session加鎖的順序不一致那么對應的解決死鎖問題的關鍵就是:讓不同的session加鎖有次序。

參考:https://blog.csdn.net/tr1912/article/details/81668423

間隙鎖

  處理串行化解決幻讀,可以使用間隙鎖來解決幻讀

殺死鎖進程

https://blog.csdn.net/shmily_lsl/article/details/82696097

https://blog.csdn.net/shmily_lsl/article/details/82696097

 

並發事務出現的問題

1、更新丟失

  第一個事務查詢數據是10,減去2,更新為8,

  第二個事務同時查詢數據是10,減去1,更新成了9

2、贓讀

3、可重復讀

4、幻讀

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM