by何登成
by何登成(這篇部落格提到了乙個無比微妙的死鎖情況,涉及innodb死鎖預防。)
這篇文章從乙個簡單的sql語句delete from t1 where id = 10;,分析在各種情況下的加鎖情況。以下為這篇文章的目錄,感謝何博士的分享。
1 背景 1
1.1 mvcc:snapshot read vs current read 2
1.2 cluster index:聚簇索引 3
1.3 2pl:two-phase locking 3
1.4 isolation level 4
2 一條簡單sql的加鎖實現分析 5
2.1 組合一:id主鍵+rc 6記錄x鎖
2.2 組合二:id唯一索引+rc 6唯一索引x鎖+對應記錄x鎖
2.3 組合三:id非唯一索引+rc 7多個(索引x鎖+對應記錄x鎖)
2.4 組合四:id無索引+rc 8全記錄x鎖
2.5 組合五:id主鍵+rr 9記錄x鎖
2.6 組合六:id唯一索引+rr 9唯一索引x鎖+對應記錄x鎖
2.7 組合七:id非唯一索引+rr 9多個(索引x鎖+對應記錄x鎖)+多個索引gap鎖
2.8 組合八:id無索引+rr 11 全紀錄x鎖,全gap鎖
2.9 組合九:serializable 12mvcc降級為lock-based併發控制
3 一條複雜的sql 12
4 死鎖原理與分析 14
5 總結 16
總結部分:
1、了解資料庫的一些基本理論知識:資料的儲存格式 (堆組織表 vs 聚簇索引表);併發控制協議 (mvcc vs lock-based cc);two-phase locking;資料庫的隔離級別定義 (isolation level);
2、了解sql本身的執行計畫 (主鍵掃瞄 vs 唯一鍵掃瞄 vs 範圍掃瞄 vs 全表掃瞄);
3、了解資料庫本身的一些實現細節 (過濾條件提取;index condition pushdown;semi-consistent read);
4、了解死鎖產生的原因及分析的方法 (加鎖順序不一致;分析每個sql的加鎖順序)。
18 mysql內建功能 儲存過程
儲存過程包含了一系列可執行的sql語句,儲存過程存放於mysql中,通過呼叫它的名字可以執行其內部的一堆sql 使用儲存過程的優點 1.用於替代程式寫的sql語句,實現程式與sql解耦 2.基於網路傳輸,傳別名的資料量小,而直接傳sql資料量大使用儲存過程的缺點 1.程式設計師擴充套件功能不方便補充...
MySQL加鎖分析
參考 mysql 加鎖處理分析。該文已經講的很詳盡了,也易懂,下面僅僅是個人做的總結。逐條處理,逐條加鎖。gap鎖是間隙鎖,即相鄰兩條有效記錄間隙的鎖 鎖的是間隙 它是針對insert的,用來解決幻讀的發生。它會阻塞insert,但不會阻塞delete update等 記錄本來也不存在 rc與rr的...
MySQL必知必會 18MySQL更新資料
mysql必知必會 18mysql更新資料,基本的update語句由3部分組成,分別是 要更新的表 列名和它們的新值 確定要更新行的過濾條件。set子句設定cust email列為指定的值 在更新多個列時,只需要使用單個set命令,每個 列 值 對之間用逗號分隔 最後一列之後不用逗號 update語...