2011-12-20 82 views
5

如何在php中鎖定mysql表?我目前有這樣的代碼:如何在php中鎖定mysql表

$db->query("LOCK TABLES tbl_othercharge WRITE"); 
for($x=0;$x<=500; $x++){ 
    $id = get_max(); 
    $db->query("INSERT INTO tbl_othercharge SET tblocID = '$id', assessmentID='lock1'"); 
} 

$db->query("UNLOCK TABLES"); 

這裏是get_max()函數,如果上面的腳本同時執行,顯然會失敗。

<?php 
    function get_max(){ 
     global $db; 
     $max = $db->get_var("SELECT MAX(tblocNumber) FROM tbl_othercharge"); 
     if($max == null){ 
      $max = 1; 
     }else if($max >= 1){ 
      $max = $max + 1; 
     } 
     return 'OC'.$max; 
    } 
    ?> 

我想通過在2瀏覽器上執行相同的腳本來測試是否仍有併發問題。 上面的腳本插入400+條記錄而不是999條記錄。我在插入東西時如何正確鎖定桌子。

我想鎖定表,以防止這樣的事情發生: enter image description here

正如你可以看到帶有前綴「OC」的領域上它應該有一個數字,它等於自動遞增首要的關鍵。

+0

爲什麼要鎖定表格? – 2011-12-20 13:26:07

+0

InnoDB存儲引擎和事務怎麼樣? – CodeZombie 2011-12-20 13:27:52

+0

@EugenRieck:請參閱我的編輯 – 2011-12-20 13:29:37

回答

4

唯一可靠的解決方案是使用虛擬值執行插入,獲取最後一個插入ID,並將該行更新爲正確的值。

mysql_query("INSERT INTO table (field) VALUES (dummy);"); 
$id = mysql_last_insert_id(); 
mysql_query("UPDATE table SET field='OC{$id}' WHERE id={$id} LIMIT 1;"); 
2

你有沒有嘗試:

for($x=0;$x<=500; $x++){ 
    $db->query("LOCK TABLES tbl_othercharge WRITE"); 
    $id = get_max(); 
    $db->query("INSERT INTO tbl_othercharge SET tblocID = '$id', assessmentID='lock1'"); 
    $db->query("UNLOCK TABLES"); 
} 

這樣您將設置每次鎖定您插入行!

3

我建議從表中刪除'OC'字段,例如,

CREATE TABLE tbl_othercharge (tblocID int AUTO_INCREMENT PRIMARY KEY, assessmentID varchar(100)); 

CREATE VIEW vw_othercharge SELECT tblocID, concat('OC',tblocID) as OCnumber, assessmentID FROM tbl_othercharge 

現在將所有相關的SELECT指向vw_othercharge並忘記它。