mysql 锁等待/死锁

  • ERROR 1213: Deadlock found when trying to get lock
  • ERROR 1205: Lock wait timeout exceeded; try restarting transaction
  • UPDATE/DELETE 语句长时间挂起
  1. 查看当前锁等待
    -- MySQL 8.0 SELECT * FROM performance_schema.data_lock_waits\G -- MySQL 5.7 SELECT r.trx_id waiting_trx_id, r.trx_mysql_thread_id waiting_thread, r.trx_query waiting_query, b.trx_id blocking_trx_id, b.trx_mysql_thread_id blocking_thread, b.trx_query blocking_query FROM information_schema.innodb_lock_waits w JOIN information_schema.innodb_trx b ON b.trx_id = w.blocking_trx_id JOIN information_schema.innodb_trx r ON r.trx_id = w.requesting_trx_id;
  2. 查看最近一次死锁详情
    SHOW ENGINE INNODB STATUS\G -- 搜索 LATEST DETECTED DEADLOCK 段落
  3. Kill 阻塞源线程(紧急解锁)
    KILL <blocking_thread_id>;
  • 保持事务短小,及时提交;避免在事务中交互式等待
  • 多表操作时统一加锁顺序(如按 ID 从小到大)
  • 对热点行使用 SELECT ... FOR UPDATE 乐观/排队策略
  • 合理设置 innodb_lock_wait_timeout(默认 50s,建议 10s)
上一篇 这样的网络拓扑对吗?
下一篇 mysql CPU飙升