# MySQL 8.0 OCP 查漏补缺-死锁

最近在考MySQL 8.0的OCP ,开个专题专门查漏补缺下

只是做备忘,有的概念只是一笔带过,具体可自行搜索

基于8.0.26

## 1. 死锁检测

通过innodb_deadlock_detect变量来决定是否进行死锁检测,当开启时一旦发生死锁会回滚其中一个事务来解决,该会话被成为受害者,innodb试图回滚事务较小的会话,根据DML的操作

如果该参数被关闭,则会等到innodb_lock_wait_timeout 参数归档的时间来回滚事务


## 2. 如何减少死锁

1.  可以通过SHOW ENGINE INNODB STATUS.命令来查看最后一次死锁情况并进行处理

2. 如果频繁发生死锁可以开启innodb_print_all_deadlocks 参数来打印所有的死锁到错误日志

3. 需要有事务重做机制,对失败的事务进行重做
4. 事务要尽可能的小来减少死锁发生的几率
5. 事务完成后尽快进行commit或rollback,在交互式界面进行事务性操作后即时关闭窗口
6. 如果使用locking read语句,如SELECT ... FOR UPDATE 或 SELECT ... FOR SHARE,试着使用READ COMMITTED隔离级别
7. 合理使用索引来减少扫描的记录数并减少锁的个数
8. 不要使用for update或for share以及使用READ COMMITTED隔离级别