解除正在死锁的状态有两种方法:
第一种:
1.查询是否锁表
show OPEN TABLES where In_use > 0;
2.查询进程(如果有SUPER权限,可以看到所有线程。否则,只能看到自己的线程)
show processlist
3.杀死进程id(就是上面命令的id列)
kill id
例子:
查出死锁进程:SHOW PROCESSLIST
杀掉进程 KILL 555555;
第二种:
1.查看下有锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;
2.杀死进程id(就是上面命令的trx_mysql_thread_id列)
kill trx_mysql_thread_id的值
例子:
查出死锁进程:SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;
杀掉进程 KILL 777777;
其它关于查看死锁的命令:
1:查看当前的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;
2:查看当前锁定的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
3:查看当前等锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
友情提示:kill 命令请谨慎使用。
测试锁sql
- session1
#sql控制事务,
#开启事务
START TRANSACTION;
SELECT* FROM user;
UPDATE user SET age= age-1 WHERE id =1;
SELECT* FROM user;
COMMIT;
#回滚会取消开启到结束的所有sql
ROLLBACK;
#查看修改后的数据,验证事务
SELECT* FROM user;
- session2
#sql控制事务,
#开启事务
START TRANSACTION;
SELECT* FROM user;
UPDATE user SET age= age-2 WHERE id =1;
SELECT* FROM user;
COMMIT;
#回滚会取消开启到结束的所有sql
ROLLBACK;
#查看修改后的数据,验证事务
SELECT* FROM user;