一、解决死锁方法
MySQL有三种锁的级别:页级、表级、行级。
1.1 方案一:
1、查看是否有锁表
show OPEN TABLES where In_use > 0;
2、查询进程(如果你有SUPER权限,你可以看到所有线程。否则,只能看到你自己的线程)
show processlist;
3、杀死进程id(就是上面命令的id列)
kill id
1.2 方案二:
1、查看在锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;
2、杀死进程id(就是上面命令的trx_mysql_thread_id列)
kill id
二、避免出现死锁
死锁出现的原因:根本的原因是程序逻辑的顺序,最常见的是交差更新,多个事务在同一个表或多个表上同时读写提交
2.1 事务优化
设置事务优先级:保持事务的轻量,越是轻量的事务,占有越少的锁资源,这样发生死锁的几率就越小
2.2 sql语句优化
避免使用子查询,尽量使用主键等等,越早提交事务,锁就越早释放
2.3 配置优化
设置超时时间:事务处理时间超过设定时间就退出