繁体   English   中英

修复 Laravel 并发问题。 在 if 条件和插入 eloquent 之间

[英]Fix the Laravel concurrency problem. Between if condition and insert eloquent

PHP版本: 7.2.4

Laravel版本: 5.8.34

MySQL 版本: 5.6.41

MySQL 服务器类型: MySQL

MySQL 表存储引擎: InnoDB

描述:

这些代码中存在并发:

...

$orderExist = Order::where('address', $address)
    ->where('order_status', 'open')
    ->where('type', 'bulk')
    ->where('way', 'site')
    ->whereDate('created_at', '>=', Carbon:today())
    ->whereNull('deleted_at')
    ->exists();

if (!$orderExist) {
    $order = Order::create([
        'admin_id' => auth()->user()->id,
        'address'  => $address,
        'status'   => 'open',
        'type'     => 'bulk',
        'way'      => 'site',
    ]);
} else {
    return 'duplicate_order';
}

OrderProduct::create([
    'order_id'   => $order->id,
    'product_id' => $product->id,
    'count'      => $request->count,
    'unit_id'    => $product->unit_id,
    'brand_id'   => $product->brand_id,
]);

...

代码告诉我们:如果orders表中有特殊订单,则返回。 但如果没有特殊订单,请创建一个新订单,然后为该新订单插入新产品。

但有时两个请求会在orders表中同时插入两个重复订单。

我找到了这些方法:

  1. Laravel 队列:它不返回新插入的订单id,也不能解决并发问题。
  2. Laravel 事务:不能在其中使用if条件。 如果其中一些查询失败并且与解决并发问题无关,它也与回滚多个查询有关
  3. INSERT … ON DUPLICATE KEY UPDATE查询:它查询导致运行两个请求。 因此,关于并发问题是不正确的。
  4. 锁表:InnoDB 存储引擎只支持行级锁,不支持表级锁 基于MyISAM-concurrent-insertsinnodb-locking
  5. ...

请帮我解决这个并发问题。

也许GET_LOCK()RELEASE_LOCK()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM