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