$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
会有所帮助吗?
答案 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将始终返回正确的值。