【问题标题】:More than one request at the same time in phpphp中同时多个请求
【发布时间】:2021-06-22 07:41:32
【问题描述】:

我对在 php.ini 中一次提交多个请求有疑问。我有一个 php 函数说 insertOrder() 将详细信息插入数据库表并向用户发送通知。详细信息将从另一个来源自动发布到此功能。这些是 insertOrder() 中的步骤

  1. 启动Mysql事务
  2. 从orderId=123的数据库表中选择订单数(来自post数据)
  3. 如果 count= 0 则插入数据库表并发送通知
  4. 如果不为 0 则更新订单
  5. 提交

问题是有时系统会同时将相同id的数据发送到inserOrder()。在那个时候,Select the order count from the database table where orderId=123 将始终为 0,因此它将尝试将两个帖子详细信息插入到数据库表中。即使我使用的是 mysql 事务,它也会插入重复的行。可能是什么原因?如果有人知道,请帮我整理一下。

以下是inserOrder()的两个示例数据

{orderId:123,status:pending}

{orderId:123,status:completed}

当我们第一次向 insertOrder() 获取数据时,ID 为 123 的订单不会出现在数据库表中,因此它将插入到数据库表中,第二次它应该更新数据库表的值。由于它同时获取两个数据,因此它正在插入到数据库表中。

这是insertOrder的代码sn-p

function insertOrder()
{
    $orderId = $_POST['orderId'];
        
    
    try
    {
        start transaction

            $order = select from table where orderId=$orderId

        if(count($order) == 0)
            Insert the order
            commit
        else
            update order where orderId=$orderId
        }
    catch()
    {
        rollback
    }
}

【问题讨论】:

  • 行是重复的还是它们具有相同的 id 和不同的订单数据?您在哪里生成订单 ID#?
  • 请分享你的php代码片段\
  • 为什么不让数据库分配orderId?
  • 我刚刚更新了问题并将帖子数据添加到函数中。你能检查一下吗?
  • 检查什么?给定的“insertOrder 的代码 sn-p”不包含有效的 PHP 代码

标签: php mysql


【解决方案1】:

如果您可以插入具有重复 ID 的行,那么您在此列上没有 UNIQUE 约束。如果你让它唯一,那么最后一个事务将无法提交。

您至少有两种选择:

  1. 主键通常用于 ID 列。见https://en.wikipedia.org/wiki/Primary_key
ALTER TABLE table_name ADD PRIMARY KEY (id);
  1. 只是一个唯一的约束:
ALTER TABLE table_name ADD CONSTRAINT constraint_name UNIQUE (id);

请注意,允许客户端为插入的记录选择 ID 是不常见的。大多数情况下,您应该允许数据库为订单等实体选择下一个 ID。

【讨论】:

  • H Alexey,感谢您的回复。我不能将它添加为主,实际上是数据库中的 orderId 字段。我已经更新了问题,我已经在表中有一个主键id
  • OK,那么它不是主键。但是你为什么拒绝使用UNIQUE?是否存在具有相同 orderId 的合法行?它们是什么?
猜你喜欢
  • 2018-06-17
  • 2011-11-28
  • 1970-01-01
  • 1970-01-01
  • 2017-03-04
  • 1970-01-01
  • 1970-01-01
  • 2019-07-09
相关资源
最近更新 更多