如果两个事务出现相互等待,则会导致死锁,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
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步