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 , когда вы блокируете одну строку, вся запись (таблица) блокируется!.