如何在Mysql中检查特定表是否被锁定?

4

我正在执行以下查询,以查找我的临时表是否被锁定。

show open tables where in_use > 0 and table = 'temp'

但是它会抛出以下错误:
语法错误,附近的'table = 'temp''。
我已经搜索过了,但无法获得正确的语法。请问有人能帮忙吗?
1个回答

7

方法1:只需执行show processlist;或show full processlist;命令,检查processlist中是否有任何查询/表显示为被锁定。

注意:从超级用户检查服务器上所有正在运行的进程。

方法2:执行show engine innodb status;,就可以在这里检查锁定情况...

方法3:在mysql 5.6及以上版本中,您也可以在information_schema数据库中检查它。

注意:如果您使用任何gui工具,如mysqladministrator,则可以在其中检查所有正在运行的进程,并轻松找到是否有任何表被锁定....

更新:

由于您想通过sql查询获得此内容,因此您可以使用以下查询-

对于所有被锁定的表-

SHOW OPEN TABLES WHERE in_use>0;

查看特定的表 -

SHOW OPEN TABLES WHERE in_use>0 AND `Table`='your_table_name';

嗨Zafar,实际上我想通过任何SQL查询来检查这个。我正在编写Java代码,在其中我想在一些表上添加锁定。因此,在放置锁之前,我想检查特定的表是否已经获取了任何锁。有什么想法吗? - Pratik
我有一个疑问。我执行了查询SHOW OPEN TABLES WHERE in_use>0 AND Table='x';然后尝试锁定表x,结果抛出了java.sql.SQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction对此有什么想法吗? - Pratik
您正在锁定一张正在任何事务中使用的表,因此当MySQL要锁定该表时会发生死锁情况,此时在一定时间后,事务要么获得免费锁定并完成,要么回滚。 - Zafar Malik
是的,没错。但是我提到的显示打开表查询返回了空结果集,这意味着表x没有获取任何锁,对吗? 即使如此,死锁情况仍在发生。我怀疑其他事务正在使用表x。还有其他可能性吗? - Pratik
1
尝试在没有其他人使用数据库服务器的时候进行操作,因为当您检查“show open tables”时,如果所有查询都能够顺利通过而不会出现锁定,则不会显示任何锁定。但是,当您锁定一个表时,一些频繁执行的事务将锁定该表,您将无法获得锁定。要检查它,请在收到死锁消息时从超级用户运行“show fullprocesslist”命令并检查正在运行的查询,然后您可以找到哪个查询正在锁定该表。 - Zafar Malik
锁定表/解锁表查询的性能如何取决于表中记录的数量? - Pratik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接