【问题标题】:Duplicate rows in the database [duplicate]数据库中的重复行[重复]
【发布时间】:2015-04-17 17:12:53
【问题描述】:

我们遇到了一个问题,我们有 5 张可供预订的餐桌。我们遇到的问题是这些桌子非常受欢迎,希望预订这些桌子的用户都尝试同时预订,有时同一张桌子被分配了两次。阻止这种情况发生的最佳方法是什么(完全证明)?

代码如下

$date="2015-05-01 19:00";


// LIST OF DINNER TABLES
$fcas = array('Table 1','Table 2','Table 3','Table 4','Table 5');}


// FIND AVAILABLE DINNER TABLE
$sql = "SELECT * FROM bookings WHERE   date_time='$ed' and table_assigned IN ('" . implode("','", $fcas) . "'))";


$rs = mysql_query($sql);

if (!$rs) {
    // Handle query errors here
}

$rows = array();

while ($row = mysql_fetch_array($rs)) {
    $rows[$row['table_assigned']] = $row;
}

foreach ($fcas as $fca) {
    if (!isset($rows[$fca])) {
        break;
    }
}


// INSERT RECORD

$sql_insert = "INSERT INTO bookings (date_time, table_assigned) VALUES ('".mysql_real_escape_string($date)."', '".mysql_real_escape_string($fca)."')";

if (!mysql_query($sql_insert)) {
    die('Error: ' . mysql_error());
}

【问题讨论】:

  • 这是一种非常可怕的访问数据库的方式。
  • mysql_* 函数已弃用。您应该转到mysqli_*,或者更好的是,使用 PDO 与您的数据库进行通信。
  • 一旦有人开始预订,您应该在 x 时间内阻止/预订一张桌子。如果在一定时间内未完成/确认预订,则再次释放它。
  • 嗨,Jeroen,这就是我们所做的,但由于它们都是同时添加的,因此可能会导致重复问题。
  • 不,在访客打开预订页面的那一刻,您应该已经通过阻止表来检查和更新您的可用性。那么就不能有重复了。

标签: php mysql


【解决方案1】:

最好的方法是使用事务。

您需要了解它们!

您基本上会尝试预订餐桌。表将锁定。将尝试保留,如果成功,继续并解锁。

因此,只要它在处理,谁先保留该表就会锁定该表。

编辑:一些 cmets 提到一旦请求开始就阻止该表。这基本上就是 Ticketmaster 对座位所做的事情,你有 x 时间来完成,或者座位被释放回可预订的桌子池中。

【讨论】:

  • 与我们所做的不同之处在于,当用户单击添加按钮时,我们分配表 1,然后单击表 2 等。用户实际上并没有选择他们想要的餐桌。当两个用户同时点击时,有可能(尽管很少见)检查完成后两个结果都返回 0,因此脚本会将同一个表分配给两个用户。
  • 这正是交易会阻止的。您只需要更改脚本以使用事务。没有同时点击,即使是毫秒,系统会先取第一个,拒绝第二个,你可以把它分配给下一个可用的表。
猜你喜欢
  • 1970-01-01
  • 2015-01-13
  • 2012-06-02
  • 2014-06-01
  • 1970-01-01
  • 2020-10-10
  • 1970-01-01
  • 2013-08-14
相关资源
最近更新 更多