1、查看当前运行的所有事务
SELECT * FROM information_schema.INNODB_TRX;
2、 查看当前出现的锁
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
3、锁等待的对应关系
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
4、模拟死锁通过上面三个命令查看结果如下
解决方案如下:
5、show processlist;
查看运行线程id 当然第一条命令 trx_mysql_thread_id也可以
kill id
执行kill命令
6、Lock wait timeout exceeded; try restarting transaction异常
也会出现这个异常倒了锁等待的最大时间innodb_lock_wait_timeout
可查看数据库的锁等待时间
SHOW GLOBAL VARIABLES LIKE 'innodb_lock_wait_timeout';
然后设置对应的时间
SET GLOBAL innodb_lock_wait_timeout=180;
缺点:全局更改,影响也是全局的,等待时间加长,容易使等待事务增多导致堆积问题。
7、找到对应死锁sql,分析优化解决
附上简单的模拟死锁:
建表语句:
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
事务1
START TRANSACTION 第一步
SELECT * FROM `user` where id = 2 ; 第二步
delete FROM `user` where id = 2 ; 第五步
commit
事务2
START TRANSACTION 第三步
delete FROM `user` where id = 2 ; 第四步
commit
执行完以上五步就会出现死锁可通过命令进行查看测试
以上是随笔 有问题可指出