# 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隔离级别