行鎖
走索引進行行鎖
表鎖
解決:對更新字段建立索引(唯一),當走索引只會進行行鎖;
當一條更新語句沒有走索引,可能就會進行表鎖,此時其他事物無論更新和插入都會等待
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、幻讀