鎖是需要事務結束後才釋放的。
壹個是 MVCC,壹個是兩階段鎖協議。
為什麽要並發控制呢?是因為多個用戶同時操作 MySQL 的時候,為了提高並發性能並且要求如同多個用戶的請求過來之後如同串行執行的壹樣(為了解決臟讀、不可重復讀、幻讀)
官方定義:
兩階段鎖協議是指所有事務必須分兩個階段對數據加鎖和解鎖,在對任何數據進行讀、寫操作之前,事務首先要獲得對該數據的封鎖;在釋放壹個封鎖之後,事務不再申請和獲得任何其他封鎖。
對應到 MySQL 上分為兩個階段:
但是兩階段鎖協議不要求事務必須壹次將所有需要使用的數據加鎖(innodb在需要的索引列數據才鎖行),並且在加鎖階段沒有順序要求,所以這種並發控制方式會形成死鎖。
MySQL有兩種死鎖處理方式:
死鎖檢測 (默認開啟)
死鎖檢測的原理是構建壹個以事務為頂點、鎖為邊的有向圖,判斷有向圖是否存在環,存在即有死鎖。
回滾
檢測到死鎖之後,選擇插入更新或者刪除的行數最少的事務回滾,基於 INFORMATION_SCHEMA.INNODB_TRX 表中的 trx_weight 字段來判斷。
收集死鎖信息:
減少死鎖:
死鎖解決: