死锁在平时工作中总是很常见,我们又不可能总是实时关注着,那么怎么去把发生死锁的一些情况记录下来呢?
1、配置文件
在MySQL 5.6版本中查看死锁,需要执行show engine InnoDB status\G;命令。
在MySQL 5.6/5.7或MariaDB 10.0/10.1版本中,在my.cnf配置文件里加入:
innodb_print_all_deadlocks=1
就可以把死锁信息打印到错误日志里。
2、全局参数
mysql> show variables like '?adlock%'; mysql> set global innodb_print_all_deadlocks=1;
3、死锁实验
3.1、准备数据
mysql> create table t1(id int,name varchar(20)); mysql> insert into t1 values(1,'b'); mysql> insert into t1 values(5,'c'); mysql> commit; mysql> select * from t1; mysql> create index idx_t on t1(id); --后面update如果条件有索引,锁行,如果没有,锁表
3.2、产生死锁
会话1: mysql> select * from t1; mysql> begin; mysql> update t1 set name='b1' where id=1; 会话2: mysql> select * from t1; mysql> begin; mysql> update t1 set name='c2' where id=5; 会话1: mysql> update t1 set name='c1' where id=5; ----等待 会话2: mysql> update t1 set name='b2' where id=1; ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction 会话1: mysql> update t1 set name='c1' where id=5; ------此时可以发现会话1执行成功