Php 在Laravel中处理并发

Php 在Laravel中处理并发,php,mysql,laravel,concurrency,Php,Mysql,Laravel,Concurrency,我正在创建一个与MySQL清单数据库交互的API。我们有15个用户可以保留产品,并通过以下方式更新数据库: 降低现有值并增加产品的保留值 inventory表如下所示: id int sku varchar on-hand int reserved int 问题是:如果两个用户同时尝试更新行,如何处理该行的更新 我想到的第一个方法是使用: 既不使用事务也不使用悲观锁 也不要使用更新 对于赛车状况,您最好检查数据库,并取消更新,改用insert。制作一个数据透

我正在创建一个与MySQL清单数据库交互的API。我们有15个用户可以保留产品,并通过以下方式更新数据库:

  • 降低现有
    并增加产品的
    保留值
inventory
表如下所示:

id        int
sku       varchar
on-hand   int
reserved  int
问题是:如果两个用户同时尝试更新行,如何处理该行的更新

我想到的第一个方法是使用:


既不使用事务也不使用悲观锁

也不要使用更新

对于赛车状况,您最好检查数据库,并取消更新,改用insert。制作一个数据透视表以容纳用户和产品之间的连接。并仅将第一个连接记录(其中id较小)作为实际记录

如果需要更多解释,这里是一个示例

假设两个用户竞相购买产品。它们几乎同时在pivot表中创建记录,但有人应该是firs,对吗?它们都提交非常小的事务来持久化数据。然后-他们都读取pivot表来验证谁成功了。它们的第一条记录都是相同的,在使用中不会有阻塞(至少是显式的)。因此,一位客户将获得记录并感到高兴,另一位客户将重新申请获得另一种产品


问题解决了

没有任何方法可以帮助您同时对抗两个人。第二次更新将排队并在第一次更新后执行。您将始终得到来自最后一个更新的用户的数据。这与laravel无关,但与数据库设计有关。您需要一个历史记录表来显示每个用户对股票做了什么。您要进行的计算是求和或扣除,或者使用历史记录表所需的任何内容。拥有15名用户,两人“争夺”独家更新权的几率几乎为零。我们实际上已经用一个历史表(kardex)设计了数据库,但我想,在某个时候,该表将有数千行,这会减慢处理过程,因为它必须重新计算值@注意,你怎么看?如果你说有几十亿行,那就有点问题了。千。。没有那么多。你也不必总是浏览整张表才能把数字拿出来,你总是可以在某个时候具体化库存数量,然后从那里继续。如果你处理股票,你需要有历史记录表来跟踪股票。若你们使用历史记录表,你们总是可以知道你们需要什么计数(若你们有10个存货,2个已经售出,1个已经损坏,你们有7个要出售——你们可以对其进行完整性检查)。我们已经涵盖了这一点。我们有
库存
表,其中包含实际值;包含所有移动和操作的
Kardex
表,以及包含操作前后受影响行的值的
History
表。好的,听起来您已经设置好了-在这个阶段,我不会太担心性能。如果数据模型设置正确,则可以对其进行缩放。拥有准确的数字比在这里或那里节省几毫秒更重要。
<?php
    function reserveStock()
    {
        $db->beginTransaction();

        // SELECT on-hand, reserved from inventory

        // Update inventory values

        $db->commit();

        return response()->json([ 'success' => 1, 'data' => $data ])
    }
<?php
    function reserveStock()
    {

        // SELECT on-hand, reserved from inventory with ->sharedLock()

        // Update inventory values

        return response()->json([ 'success' => 1, 'data' => $data ])
    }