如果两个事务出现相互等待,则会导致死锁,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

 

posted on 2018-01-28 15:14  偶尔发呆  阅读(396)  评论(0编辑  收藏  举报