線上碰到存儲過程死鎖問題了,開始覺得非主鍵查詢 for update 會致使表鎖,後來通過測試 innodb下for update索引生效的狀況下 根據索引字段查詢是行級鎖,會將整個結果集進行上鎖,直到事務結束。 node
錯誤地方進行一些修正,通常狀況的確是將索引的結果集進行上鎖,可是因爲表過大的狀況,mysql爲了性能自動優化將索引附近的結果集所有進行上鎖。mysql
具體實驗過程能夠看https://blog.csdn.net/qq_31975227/article/details/103710018,本身作一遍也能實驗出來。sql
可是存儲過程死鎖的問題仍是沒有解決,不過該存儲過程只是進行內存統計數據的落庫,因此不該該上鎖。雖然程序是node調用,可是也不會出現執行順序問題,若是出現了執行順序問題加了行級鎖也是沒有用的,又不是在源數據進行加減等計算操做,計算操做都在內存完成了,最後只進行了落庫操做。(來至我的的吐槽,我沒辦法說法領導,後來和領導溝通說明白了問題)數據庫
死鎖的問題經過分析死鎖日誌文件解決了,因爲上面一塊錯誤的認識。一直認爲兩個非惟一索引能夠命中單條記錄,其實mysql爲了性能命中了多條。性能
一個簡單的update語句,update ? where id1=1 and id2=2 id1和id2 都是非惟一索引,這時有的語句會對由於優化致使上鎖其餘索引周邊的數據條目,這時他會等待內建惟一索引的鎖,而一樣的語句會對內建惟一索引加鎖,等待id1 或者id2的鎖,出現同一條語句迴環等待鎖的釋放,致使死鎖發生。測試
之後仍是須要多看一些數據庫方面的書籍,對原理性知識瞭解的更多一些。優化