2012-03-20 33 views
25

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; 

我的問題是,如果我在shell腳本代碼中使用這個邏輯,如果線程丟失(不殺)到達之前「UNLOCK TABLES」語句,我怎麼會知道,一些表被鎖定以及如何手動解鎖表格?

+0

您是否考慮過使用事務? http://stackoverflow.com/questions/4226766/mysql-transactions-vs-locking-tables – GordonM 2012-03-20 08:44:45

回答

19

我將如何知道某些表已鎖定?

您可以使用SHOW OPEN TABLES命令查看鎖定表。

如何手動解鎖表格?

如果您知道鎖定表會話ID - 「選擇CONNECTION_ID()」,然後就可以運行KILL命令來終止會話和UNLOCK TABLES。

+2

如果我不知道會話ID和鎖定表的終端未打開,那麼? – shantanuo 2012-03-20 09:43:48

+2

嘗試在鎖定表之前設置WAIT_TIMEOUT週期(例如SET WAIT_TIMEOUT = 120;)。這將有助於在指定的時間段後自動關閉該連接。 – Devart 2012-03-20 13:40:29

76

這裏是我做的爲FORCE解鎖一些鎖定表在MySQL

1)輸入MySQL的

mysql -u your_user -p 

2)讓我們看看鎖定表

mysql> show open tables where in_use>0; 

3)名單讓我們看看當前進程的列表,其中一個鎖定您的表(s)

mysql> show processlist; 

4)讓我們殺死這些進程

mysql> kill put_process_id_here; 
+0

非常有用!謝謝! – 2013-04-01 19:16:37

+2

不知怎的,我設法鎖定了一張表,沒有任何東西顯示在進程列表中(除了睡眠連接)... – Kevin 2013-07-11 00:43:57

+1

如果你的進程完全丟失,但你接到關於鎖定表的投訴:只需重新啓動mysqld。對我來說,這是「服務mysqld重啓」 – 2015-10-27 15:31:05

2

隨着續集專業之一:

重新啓動應用程序解鎖我的表。它重置會話連接。

NOTE: I was doing this for a site on my local machine.