Mysql多索引引發死鎖問題

UPDATE eagle_riskcon_third SET                 msessage = ?               , time = ?             
where  ip_id = ? and type = ?  引發的Deadlock found when trying to get lock解決方法有兩種:
複製代碼

第1、添加ip_id+type的組合索引,這樣就能夠避免掉index merge;mysql

第2、將優化器的index merge優化關閉;sql

建議選擇第一種方法來避免此問題的發生。bash

update時,若是where條件裏面涉及多個字段,區分度都比較高且字段都分別建了索引的話,mysql會多個索引各走一遍,而後結果取個交集; 單條記錄更新不會引起問題; 多條記錄併發更新時,若是索引行數有重疊,因加鎖順序可能不一樣,互相等待可能會致使死鎖,爲何加鎖順序會不一樣呢?咱們的sql中where條件的順序是必定的,那麼加鎖順序也應該必定,爲何會有加鎖順序不一樣狀況。狀況是這樣的,由於咱們使用的是兩個單值索引,where條件中是複合條件,那麼mysql會使用index merge進行優化,優化過程是mysql會先用索引1進行掃表,在用索引2進行掃表,而後求交集造成一個合併索引。這個使用索引掃表的過程和咱們自己的sql使用索引的順序可能存在互斥,因此形成了死鎖。併發

相關文章
相關標籤/搜索