收到警報,資料庫死鎖回滾交易失敗
show engine innodb status; 獲取最近發生的deadlock表t結構:配置:innodb_print_all_deadlocks並在error log檢視
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...