參考:mysql 加鎖處理分析。該文已經講的很詳盡了,也易懂,下面僅僅是個人做的總結。
逐條處理,逐條加鎖。
gap鎖是間隙鎖,即相鄰兩條有效記錄間隙的鎖(鎖的是間隙),它是針對insert的,用來解決幻讀的發生。它會阻塞insert,但不會阻塞delete/update等(記錄本來也不存在)。
rc與rr的重要區別就是幻讀。所以rr才需要引入gap鎖。
說加什麼鎖,首先要了解兩個前提:1)隔離級別;2)用到的索引。不同的隔離級別,不同的索引都會影響加鎖。
主鍵/唯一鍵
二級索引
無索引select無無
無insert
行鎖行鎖
行鎖select...for update/update/delete
行鎖有效行的行鎖
全表鎖聚簇索引
主鍵/唯一鍵
二級索引
無索引select無無
無insert
行鎖行鎖
行鎖select...for update/update/delete
行鎖有效行的行鎖+gap鎖
全表鎖聚簇索引
主鍵/唯一鍵
二級索引
無索引select(快照讀)ss
s其他(當前讀)xx
x注意:無索引時,select...for update/update/delete是需要鎖全表的,但mysql_server可以做優化,在逐條加鎖時,如果發現不是目標記錄,可以釋放掉鎖。但這會違背2pl的原則。
死鎖的發生與否,並不在於事務中有多少條sql語句,死鎖的關鍵在於:兩個(或以上)的session加鎖的順序不一致。
加鎖過程是逐條處理,逐條加鎖(最終都反映在聚簇索引上)的。
所以如果兩個session用到不同的二級索引,那麼對聚簇索引的加鎖順序是不一致的,從而導致session間鎖的持有與競爭,很容易產生死鎖。
18 MySQL加鎖處理分析
by何登成 by何登成 這篇部落格提到了乙個無比微妙的死鎖情況,涉及innodb死鎖預防。這篇文章從乙個簡單的sql語句delete from t1 where id 10 分析在各種情況下的加鎖情況。以下為這篇文章的目錄,感謝何博士的分享。1 背景 1 1.1 mvcc snapshot read...
mysql自定義加鎖 為MySQL加鎖?
在日常操作中,update insert delete innodb會自動給涉及的資料集加排他鎖,一般的 select 一般是不加任何鎖的。我們可以使用以下方式顯示的為 select 加鎖。共享鎖 select from table name where id 10 lock in share mo...
MySQL加鎖規則
鎖是加在索引上的 加鎖規則裡面,包含了兩個 原則 兩個 優化 和乙個 bug 原則 1 加鎖的基本單位是 next key lock。next key lock 是前開後閉區間。原則 2 查詢過程中訪問到的物件才會加鎖。優化 1 索引上的等值查詢,給唯一索引加鎖的時候,next key lock 退...