2009-11-07 27 views
1

我在myisam表中有一個計數器字段。要更新多任務環境(Web服務器,來自PHP的併發查詢)中的計數器值,我需要鎖定記錄以進行更新。 所以我不喜歡這樣寫道:在MyISAM表上鎖定和處理的問題

START TRANSACTION; 
SELECT Counter FROM mytable ... FOR UPDATE; 
UPDATE Counter value or INSERT INTO mytable; 
// let's make sleep for 20 seconds here to make transaction longer 
COMMIT; 

據我瞭解,在MyISAM中整個表應該被鎖定,直到交易結束。 當我從PHP啓動併發查詢時,在瀏覽器中打開腳本,它真的等待,直到鎖定消失。 但是,如果我從一個包含mysql.exe的表中選擇所有記錄 - 它將選擇所有記錄,即使仍然保持鎖定狀態。

所以看來我不明白的東西。請解釋這種行爲。

回答

5

MyISAM表不支持事務 - START TRANSACTIONCOMMIT什麼都不做。

您可以使用LOCK TABLES

LOCK TABLES mytable READ; 
... 
UNLOCK TABLES; 
+0

謝謝您的答覆。這是真的。它似乎是我的網絡服務器誰被封鎖(Apache),並不能同時做2個查詢。很奇怪。 – nightcoder 2009-11-07 16:09:43