2011-12-20 68 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并忘记它。