如何在php中锁定mysql表

Wer*_*eta 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");
Run Code Online (Sandbox Code Playgroud)

这是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;
    }
    ?>
Run Code Online (Sandbox Code Playgroud)

我试图通过在2个浏览器上执行相同的脚本来测试是否仍然存在并发问题.上面的脚本插入400多条记录而不是999条记录.我在插入物品时如何正确锁定桌子.

我想锁定表以防止发生这样的事情: 在此输入图像描述

正如您所看到的,前缀为"OC"的字段应该有一个等于自动增量主键的数字.

Mae*_*lyn 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;");
Run Code Online (Sandbox Code Playgroud)