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如何避免事务
- 避免大事务。将大事务拆分成小事务,减少事务时间,快速释放锁
- 调整锁的申请顺序。
- 更改数据库隔离级别
- 合理建立索引。如果命中索引则会使用行锁,否则全表加锁
- 合理设置死锁监测的等待时长。

浙公网安备 33010602011771号