MySQL、Java中发生死锁该怎么办?

MySQL发生死锁时

自动检测与回滚
MySQL自带死锁监测机制,检测到死锁后,自动回滚另外一个事务(通常是拥有资源少的那个)。
手动kill被阻塞的事务
寻找产生死锁的事务:

# 返回一对数据(信号量、事务、IO、死锁日志等)
SHOW ENGINE INNODB STATUS

或者:

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;

表可查锁的信息,请求锁的事务id和持有所得事务id、锁id
手动kill

KILL <threadId>(mysql里面的线程id)

MySQL如何避免事务

  1. 避免大事务。将大事务拆分成小事务,减少事务时间,快速释放锁
  2. 调整锁的申请顺序。
  3. 更改数据库隔离级别
  4. 合理建立索引。如果命中索引则会使用行锁,否则全表加锁
  5. 合理设置死锁监测的等待时长。
posted @ 2025-03-13 17:00  Nammonco  阅读(39)  评论(0)    收藏  举报