MySQL笔记-死锁原理与分析及InnoDB中如何减少死锁
根據InnoDB的加鎖規則(Record Lock、Gap Lock、meta data lock)可以寫出不會發生死鎖的SQL語句,也能定位出產生死鎖的原因。
?
死鎖產生的原因:
產生回路:兩個或兩個以上的事務在執行過程中,分別持有一把鎖,然后再加一把鎖(AB-BA)產生死鎖。
加鎖順序不一致:兩個或兩個以上的事務并發執行(同一時刻),因爭奪資源而造成的一種互相等待,產生死鎖。
?
如下時序圖為產生環路:
update操作會參數排他鎖。
這里session1把id為1的行加了鎖,session2,把ID為2的行加了鎖,隨后,session1拿id為2的數據,而session2拿id為1的數據,這樣就產生了死鎖。
下面用mysql來演示下:
表如下:
create table t1( id int not null default 0, name varchar(10), primary key(id) )engine=InnoDB;查看下:
select * from t1;這樣有產生了死鎖:
mysql有解鎖機制,這里可以看到產生了Deadlock。然后將其釋放了,這樣session1就運行成功了!
使用
show engine innodb status \G可以查看鎖相關的信息;
?
在latest detected deadlock。如看到update t1 est name = 'ddddd' where id = 2這個地方產生了死鎖。
innodb_print_all_deadlocks開啟后可以將死鎖信息添加到error.log里面
show variables like '%dead%';目前是OFF狀態。
?
第二種情況產生死鎖是在同一時刻。如下時序圖:
這里如果session1成功將檢索到數據和session2的數據一樣,但是順序不同,就會參數死鎖。
如session1獲得的數據:
session2檢索的數據:
其實就變成了和第一種差不多的形式。
下面來說明下InnoDB中如何減少死鎖:
1. 自動死鎖檢測,優先回滾小事務;
2. 超時設置(參數innodb_lock_wait_timeout);
3. 盡快提交事務,小事務不容易發生死鎖;
4. 加for update,lock in share mode讀鎖時,最好降低事務隔離級別,例如使用RC(讀已提交),降低死鎖發生概率
5. 事務中涉及多個表,或多行時,每個事務操作順序要保持一致,最好用存儲過程/函數固化;
6. 通過索引等方式優化SQL效率,降低死鎖發生概率(減少掃描/鎖范圍,降低概率;)
總結
以上是生活随笔為你收集整理的MySQL笔记-死锁原理与分析及InnoDB中如何减少死锁的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Arduino笔记-9110风扇模块的使
- 下一篇: linux cmake编译源码,linu