【问题标题】:How to lock mysql tables in php如何在php中锁定mysql表
【发布时间】:2011-12-20 13:22:01
【问题描述】:

如何在 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 条记录。在向其中插入东西时如何正确锁定桌子。

我想锁定表以防止发生这样的事情:

正如您所见,带有前缀“OC”的字段应该有一个等于自增主键的数字。

【问题讨论】:

  • 为什么要锁表?
  • InnoDB 存储引擎和事务呢?
  • @EugenRieck:请看我的编辑
  • 999 条记录?您的循环在 500 处停止。
  • @PiTheNumber : 1000 我应该说,因为如果我同时执行它应该会产生 1000 条记录。

标签: php mysql


【解决方案1】:

唯一可靠的解决方案是使用虚拟值进行插入,获取最后一个插入 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】:

    我建议从表格中删除“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 并忘记它。

    【讨论】:

      【解决方案3】:

      你试过了吗:

      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");
      }
      

      这样每次插入一行都会设置锁!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多