MySQL具体条目数

MySQL specific number of entries

你好,我有一个 Mysql table,我在 php 脚本中填写了它。在此脚本中,我检查特定类型的条目数是否已达到最大值以通知客户。如果条目数较少,我让他在我的 table 中插入一个新条目。 table 看起来像这样

--------------------
Date          | Type 
--------------------
Tuesday 13:00 | Car

检查的php脚本看起来像这样

<?php

$sql = $conn->prepare("SELECT count(*) FROM Table WHERE Date='Tuesday 13:00' AND Type='Car'"); 
$sql ->execute(); 
$sql_rows = $sql->fetchColumn();

if ($sql_rows > 20){ 

echo "All entries for this type has been filled please choose another to continue"; 

}else{ 

$insert = $conn->prepare("INSERT INTO Table VALUES('Tuesday 13:00', 'Car')");
$insert -> execute(); 

} 
?>

我现在的问题是,如果 100 个人同时访问这个 php 脚本,php 脚本是否允许恰好 19 个人插入他们自己 'Tuesday 13:00','Car' 进入数据库或更多,我如何在不给客户带来不便的情况下防止这种情况发生?

使用事务来确保两个查询都使用 table 的相同快照。事务将锁定 table 以便其他人等待。将 $conn->startTransaction() 放在第一个 SELECT 查询之前,在查询中添加一个 FOR UPDATE 子句,并在 INSERT.

之后添加 $conn->commit()

您必须使用 InnoDB,而不是 MyISAM,事务才能有效。

<?php

$sql = $conn->prepare("SELECT count(*) FROM Table 
                        WHERE Date='Tuesday 13:00' AND Type='Car' 
                        FOR UPDATE"); 
$conn->startTransaction();
$sql ->execute(); 
$sql_rows = $sql->fetchColumn();

if ($sql_rows > 20){ 
    echo "All entries for this type has been filled please choose another to continue"; 
}else{ 
    $insert = $conn->prepare("INSERT INTO Table VALUES('Tuesday 13:00', 'Car')");
    $insert -> execute(); 
} 
$conn->commit();