innodb_trx, innodb_locks, innodb_lock_waits
原创
©著作权归作者所有:来自51CTO博客作者搬砖会快乐的原创作品,请联系作者获取转载授权,否则将追究法律责任
如果两个事务出现相互等待,则会导致死锁,MySQL的innodb_lock_wait_timeout参数设置了等待的时间限制,超时则抛异常。
select @@innodb_lock_wait_timeout;
set @@innodb_lock_wait_timeout=60;
参数innodb_rollback_on_timeout表示:超时的事务是否进行回滚,默认为off,表示不回滚。该变量在启动后不可修改。
information_schema数据库中有3张临时表描述事务之间的等待关系:
innodb_trx 事务
innodb_locks 锁
innodb_lock_waits 事务之间的等待关系
innodb_lock_waits表中字段如下:
requesting_trx_id 请求锁的事务
requested_lock_id 请求的锁的id。请求的锁可能是S锁
blocking_trx_id 占有锁的事务
blocking_lock_id 占有的锁的id。占有的锁可能是X锁
下面的sql语句查询事务之间的等待关系:
select r.trx_id waiting_trx_id,
r.trx_mysql_thread_id waiting_thread,
r.trx_query waiting_query,
b.trx_id blocking_trx_id,
b.trx_mysql_thread_id blocking_thread,
b.trx_query blocking_query
from innodb_lock_waits w
inner join innodb_trx r on w.requesting_trx_id=r.trx_id
inner join innodb_trx b on w.blocking_trx_id=b.trx_id