2012-11-04 174 views
0

我無法在MySQL中鎖定表。我已經嘗試通過在不同的瀏覽器上同時運行兩個腳本來測試併發請求。表鎖定失敗

腳本1:

mysql_query("lock tables id_numbers write"); 

$sql = "select number from id_numbers"; 
$result = mysql_query($sql); 

if ($record = mysql_fetch_array($result)) 
{ 
    $id = $record['number']; 
} 

sleep(30); 

$id++; 

$sql = "update id_numbers set number = '$id'"; 
$result = mysql_query($sql); 

mysql_query("unlock tables"); 

腳本2:

$sql = "select number from id_numbers"; 
$result = mysql_query($sql); 

if ($record = mysql_fetch_array($result)) 
{ 
    $id = $record['number']; 
} 

echo $id; 

我啓動腳本1,然後再啓動腳本2.理論上,腳本2應該等待30秒以上,直到腳本1解鎖表,然後輸出更新的ID。但它會立即輸出原始ID,所以鎖定顯然不起作用。可能會出現什麼問題?

順便說一句,我知道我不應該仍然使用mysql_ *,但我現在堅持使用它。

編輯:我發現鎖確實發生在現場,但不是在我的開發網站上。他們都在共享主機上,所以我假設這兩者之間有一些不同的設置。任何想法可能是什麼?

+1

您的鎖定書寫,不能讀取。 – 2012-11-04 02:59:07

+0

@Dagon是的,我想要讀寫。根據MySQL手冊,「WRITE鎖定:持有鎖的會話可以讀取和寫入表,只有持有該鎖的會話才能訪問該表,在鎖釋放前,沒有其他會話可以訪問它。在寫入鎖定期間,其他會話的表格會被阻止。「這就是我想要的。 – gr8dane

回答

1

使用您在此處的代碼,我會得到您期望的行爲:腳本2將會阻塞,直到腳本1發出unlock tables

你的問題必須在別處。需要檢查的事項:

  1. 表中是否實際存在數據庫? (請檢查您mysql_query()返回值和使用mysql_error(),如果你得到任何回報FALSE
  2. 連接到的相同數據庫兩個腳本?
  3. 你確定表格不是臨時的(因此連接本地)表嗎?
  4. sleep(30)期間腳本1的mysql連接(或腳本本身)是否會超時,從而比您期望的更早釋放鎖定?
+0

哎呀!寫這個問題時我犯了一個錯誤。實際的腳本會鎖定id_numbers。 – gr8dane

+0

對不起,延遲很長。我沒有意識到你的答案已經改變。是的,以1,2和3.#4:改變睡眠長度沒有任何區別。看到編輯我的原始問題。 – gr8dane

+0

數據庫用戶是否有權限鎖定表? –