mysql 解除正在死锁的状态

报错截图

DB::beginTransaction();

DB::table('mj_user')->where('id', $user->id)->decrement('charge', $amount);
DB::table('mj_user')->where('id', $user->id)->decrement('balance', $amount);
//.....

DB::commit();

file

查询mysql死锁

SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX \ G;

file

果然有两个在死锁

查询到pid,并且kill掉

SELECT `trx_mysql_thread_id` FROM INFORMATION_SCHEMA.INNODB_TRX;
kill pid

解决死锁的办法

第一种

  • 查询是否锁表
    show OPEN TABLES where In_use > 0;
  • 查询进程(如果您有SUPER权限,您可以看到所有线程。否则,您只能看到您自己的线程)
    show processlist
  • 杀死进程id(就是上面命令的id列)
    kill id

第二种

  • 查看下在锁的事务
    SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;
  • 杀死进程id(就是上面命令的trx_mysql_thread_id列)
    kill 线程ID

其它关于查看死锁的命令:

  • 查看当前的事务
    SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;
  • 查看当前锁定的事务
    SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
  • 查看当前等锁的事务
    SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;