*** (2) TRANSACTION:
- TRANSACTION 5121, ACTIVE 12 sec starting index read
- mysql tables in use 1, locked 1
- 3 lock struct(s), heap size 1136, 2 row lock(s)
- MySQL thread id 11, OS thread handle 123145555853312, query id 2765 localhost root updating
- update user set name='hehe' where id=3
*** (2) HOLDS THE LOCK(S):
- RECORD LOCKS space id 94 page no 3 n bits 80 index PRIMARY of table `test`.`user` trx id 5121 lock_mode X locks rec but not gap
- Record lock, heap no 5 PHYSICAL RECORD: n_fields 5; compact format; info bits 0
- 0: len 4; hex 80000004; asc ;;
- 1: len 6; hex 0000000013fa; asc ;;
- 2: len 7; hex 520000060129a6; asc R ) ;;
- 3: len 4; hex 68616861; asc haha;;
- 4: len 4; hex 80000015; asc ;;
*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
- RECORD LOCKS space id 94 page no 3 n bits 80 index PRIMARY of table `test`.`user` trx id 5121 lock_mode X locks rec but not gap waiting
- Record lock, heap no 7 PHYSICAL RECORD: n_fields 5; compact format; info bits 0
- 0: len 4; hex 80000003; asc ;;
- 1: len 6; hex 0000000013fe; asc ;;
- 2: len 7; hex 5500000156012f; asc U V /;;
- 3: len 4; hex 68656865; asc hehe;;
- 4: len 4; hex 80000014; asc ;;
*** WE ROLL BACK TRANSACTION (2)
InnoDB状态有很多指标,这里我们截取死锁相关的信息,可以看出InnoDB可以输出最近出现的死锁信息,其实很多死锁监控工具也是基于此功能开发的。
在死锁信息中,显示了两个事务等待锁的相关信息(蓝色代表事务1、绿色代表事务2),重点关注:WAITING FOR THIS LOCK TO BE GRANTED和HOLDS THE LOCK(S)。
WAITING FOR THIS LOCK TO BE GRANTED表示当前事务正在等待的锁信息,从输出结果看出事务1正在等待heap no为5的行锁,事务2正在等待 heap no为7的行锁;
HOLDS THE LOCK(S):表示当前事务持有的锁信息,从输出结果看出事务2持有heap no为5行锁。
从输出结果看出,最后InnoDB回滚了事务2。
那么InnoDB是如何检查出死锁的呢?
我们想到最简单方法是假如一个事务正在等待一个锁,如果等待时间超过了设定的阈值,那么该事务操作失败,这就避免了多个事务彼此长等待的情况。参数innodb_lock_wait_timeout正是用来设置这个锁等待时间的。 (编辑:西安站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|