如果线程丢失,则解锁表

sha*_*nuo 47 mysql

http://dev.mysql.com/doc/refman/5.0/en/internal-locking.html

以下是文档摘录.

mysql> LOCK TABLES real_table WRITE, temp_table WRITE;
mysql> INSERT INTO real_table SELECT * FROM temp_table;
mysql> DELETE FROM temp_table;
mysql> UNLOCK TABLES;
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果我在shell脚本代码中使用此逻辑,并且如果线程在到达"unlock tables"语句之前丢失(未被杀死),我将如何知道某些表被锁定以及如何手动解锁表?

Kos*_*tyn 124

这是我对MySQL中某些锁定表的FORCE UNLOCK所做的事情

1)输入MySQL

mysql -u your_user -p
Run Code Online (Sandbox Code Playgroud)

2)让我们看一下锁定表的列表

mysql> show open tables where in_use>0;
Run Code Online (Sandbox Code Playgroud)

3)让我们看一下当前进程的列表,其中一个是锁定你的表

mysql> show processlist;
Run Code Online (Sandbox Code Playgroud)

4)让我们杀死其中一个进程

mysql> kill put_process_id_here;
Run Code Online (Sandbox Code Playgroud)

  • 不知何故,我设法锁定一个表,没有任何东西显示在进程列表中(除了睡眠连接)... (2认同)
  • 完美运作! (2认同)

Dev*_*art 27

我怎么知道有些桌子被锁了?

您可以使用SHOW OPEN TABLES命令查看锁定的表.

如何手动解锁表格?

如果您知道锁定表的会话ID - 'SELECT CONNECTION_ID()',那么您可以运行KILL命令来终止会话和解锁表.

  • 如果我不知道会话ID和锁定表未打开的终端,那么? (3认同)
  • 尝试在锁定表之前设置WAIT_TIMEOUT周期(例如SET WAIT_TIMEOUT = 120;).它将有助于在指定的时间段后自动关闭该连接. (2认同)