線上碰到存盤程序死鎖問題了,開始以為非主鍵查詢 for update 會導致表鎖,后來經過測驗 innodb下for update索引生效的情況下 根據索引欄位查詢是行級鎖,會將整個結果集進行上鎖,直到事務結束,
錯誤地方進行一些修正,一般情況的確是將索引的結果集進行上鎖,但是由于表過大的情況,mysql為了性能自動優化將索引附近的結果集全部進行上鎖,
具體實驗程序可以看https://blog.csdn.net/qq_31975227/article/details/103710018,自己做一遍也能實驗出來,
但是存盤程序死鎖的問題還是沒有解決,不過該存盤程序只是進行記憶體統計資料的落庫,所以不應該上鎖,雖然程式是node呼叫,但是也不會出現執行順序問題,如果出現了執行順序問題加了行級鎖也是沒有用的,又不是在源資料進行加減等計算操作,計算操作都在記憶體完成了,最后只進行了落庫操作,(來至個人的吐槽,我沒辦法說法領導,后來和領導溝通說明白了問題)
死鎖的問題通過分析死鎖日志檔案解決了,由于上面一塊錯誤的認識,一直認為兩個非唯一索引可以命中單條記錄,其實mysql為了性能命中了多條,
一個簡單的update陳述句,update ? where id1=1 and id2=2 id1和id2 都是非唯一索引,這時有的陳述句會對因為優化導致上鎖其他索引周邊的資料條目,這時他會等待內建唯一索引的鎖,而同樣的陳述句會對內建唯一索引加鎖,等待id1 或者id2的鎖,出現同一條陳述句回環等待鎖的釋放,導致死鎖發生,
以后還是需要多看一些資料庫方面的書籍,對原理性知識了解的更多一些,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/89079.html
標籤:MySQL
上一篇:mysql第八課
