仅当count行等于x时才执行insert查询

时间:2014-02-16 08:43:29

标签: php mysql pdo

$res = $db->query("SELECT COUNT(*) as cnt FROM table")->fetchAll(PDO::FETCH_ASSOC);
if ( $res[0]['cnt'] == 0 ) {

   $db->query("
   INSERT INTO table (col) 
   VALUES
   ('value1'),
   ('value2'),
   ('value3'),
   ....
   ");

}

假设有2位用户同时请求此代码,

因此,对于第一个用户,count将返回0并且将执行INSERT查询,但是有可能在执行第一次插入时,对于第二个用户,count也会返回0? (在这种情况下,第二次插入查询也将执行,我不需要)。

如果可以的话,如何防止这种情况?在这种情况下使用Transactions会有所帮助吗?

1 个答案:

答案 0 :(得分:2)

因此,只有在表中没有记录时才要插入。交易不会对您有所帮助。

您可以使用WRITE LOCK:

  

只有持有锁的会话才能访问该表。在解除锁定之前,没有其他会话可以访问它。

https://dev.mysql.com/doc/refman/5.0/en/lock-tables.html

使用以下方法:

mysql> LOCK TABLES t1 WRITE;

mysql> SELECT COUNT(*) FROM t1;

mysql> INSERT INTO t1 (col) 
   VALUES
   ('value1'),
   ('value2'),
   ('value3');

mysql> UNLOCK TABLES;

如果另一个会话尝试执行命令LOCK TABLES t1 WRITE;,它将等到第一个会话结束。因此COUNT将始终返回正确的值。