Answers:
没有任何答案可以显示当前持有的所有锁。
在终端的mysql中执行此操作。
start transaction;
update someTable set name="foobar" where ID=1234;
-- but no rollback or commit - just let it sit there
显然,上面的事务保持锁定,因为该事务仍处于活动状态。但是现在没有查询在进行,也没有人在任何地方等待锁(至少现在)。
INFORMATION_SCHEMA.INNODB_LOCKS
为空,这对于文档来说是有意义的,因为只有一个事务,并且当前没有人等待任何锁。INNODB_LOCKS
无论如何也已弃用。
SHOW ENGINE INNODB STATUS
没有用:someTable
完全没有提及
SHOW FULL PROCESSLIST
为空,因为罪魁祸首目前实际上并未运行查询。
您可以使用INFORMATION_SCHEMA.INNODB_TRX
,performance_schema.events_statements_history
并且performance_schema.threads
提取的查询中所列的任何活动的事务已经在过去执行我其他的答案,但我还没有碰到过任何方式一看就知道someTable
是锁定在上面的场景。
到目前为止,其他答案中的建议至少没有帮助。
免责声明:我没有安装innotop,也没有打扰。也许这可以工作。
您可以使用以下脚本:
SELECT
pl.id
,pl.user
,pl.state
,it.trx_id
,it.trx_mysql_thread_id
,it.trx_query AS query
,it.trx_id AS blocking_trx_id
,it.trx_mysql_thread_id AS blocking_thread
,it.trx_query AS blocking_query
FROM information_schema.processlist AS pl
INNER JOIN information_schema.innodb_trx AS it
ON pl.id = it.trx_mysql_thread_id
INNER JOIN information_schema.innodb_lock_waits AS ilw
ON it.trx_id = ilw.requesting_trx_id
AND it.trx_id = ilw.blocking_trx_id