Laravel pessimisti c блокировка блокирует всю таблицу вместо одной строки - PullRequest
0 голосов
/ 18 июня 2020

Laravel Версия: 7.15

PHP Версия: 7.4.6

Драйвер и версия базы данных: MariaDB 10.4.11

Приведенный ниже код будет возвращать ответ массива для каждого счета-фактуры. После того, как метод действия вызвал id=1, требуется 20 se c для фиксации. Когда тот же метод вызвал id=2, ответ ждет, пока не завершится первая транзакция. почему блокировка на уровне строк не работает.

protected function actions($id)
    {
      DB::beginTransaction();
      try {
          if($id==1)
            sleep(20);

          $invoice = Invoice::lockForUpdate()->find($id);
          $name = 'Approve';
          if ($invoice->approved) {
             $name = 'Disapprove';      
            }
         } catch (Exception $e) {
            DB::rollBack(); 
         }
      DB::commit();

        return [
            'name' => $name,
            'id' => 'menu-approve',
            'data-status' => $invoice->approved
        ];
    }

Ранее работала Laravel 6.x

A lockForUpdate() блокирует укажите строку c, пока она не будет успешно зафиксирована (Select * from invoices where id=1 FOR UPDATE). Но select * from invoices where id=2 FOR UPDATE не следует ждать, пока будет зафиксирован первый запрос. Также без указания блокировки (Select * from invoices) записи не отображаются, и он ожидает фиксации первой транзакции. Что может быть причиной блокировки всей таблицы вместо одной строки?

В 7.x , когда вы блокируете одну строку, вся запись (таблица) блокируется!.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...