InnoDB非唯一索引導致死鎖

2021-10-24 17:21:36 字數 1282 閱讀 8951

收到警報,資料庫死鎖回滾交易失敗

show engine innodb status; 獲取最近發生的deadlock

配置:innodb_print_all_deadlocks並在error log檢視

表t結構:

table

non_unique

key_name

column_namet0

primaryidt

1mm_no

簡化語句:

圖1update語句1(id = 2933):update t set flag = 0 where m_no = 123 and f = 1;

圖1update語句2(id = 2934):update t set flag = 0 where m_no = 123 and f = 2;

select * from t where m_no = 123;

idm_no

fflag

2993

1231

02994

1232

0explain update t set flag = 0 where m_no = 123 and f = 1;

possible_keys(計畫用到的索引)

rows(計畫查詢的行數)

m_no_index

2即使只查詢f=1的記錄,仍會查詢2行

由於mysql是在索引上行鎖,兩個事務同時用乙個key–m_no_index索引,兩個事務都需要同時對m_no=123的兩條記錄上行鎖,當兩個記錄上鎖順序不一樣(事務1鎖2933行,事務2鎖2934行)就有機率發生死鎖

缺點:因為每個事務都增加了查詢和排序,增加了效能損耗,

重試機制

避免長時間持有鎖,減少死鎖概率

具體需要根據業務量和死鎖發生的概率權衡用哪種方案

配置:innodb_deadlock_detect(預設開)

事務等待圖wait-for-graph(有向圖)

一旦有向圖形成了環,表示造成死鎖,innodb報錯死鎖並回滾相應事務

how to minimize and handle deadlocks:

mysql 唯一索引 mysql建立唯一索引

檢視索引 show index from 資料庫表名 alter table 資料庫add index 索引名稱 資料庫欄位名稱 primary key 主鍵索引 alter table table name add primary key column unique 唯一索引 alter tabl...

iOS唯一標示符引導

在2013年3月21日蘋果已經通知開發者,從2013年5月1日起,替代的方案是開發者應該使用 在ios 6中介紹的vendor或advertising標示符 cfuuid方法用來建立cfuuidref,並且可以獲得乙個相應的nsstring,如下 cfuuidref cfuuid cfuuidcre...

iOS唯一標示符引導

在2013年3月21日蘋果已經通知開發者,從2013年5月1日起,替代的方案是開發者應該使用 在ios 6中介紹的vendor或advertising標示符 cfuuid方法用來建立cfuuidref,並且可以獲得乙個相應的nsstring,如下 cfuuidref cfuuid cfuuidcre...