Laravel 版本:7.15
PHP版本:7.4.6
数据库驱动程序和版本:MariaDB 10.4.11
下面的代码将返回每个发票的数组响应。一旦调用了 action 方法,id=1
它需要 20 秒才能被提交。当调用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上工作
AlockForUpdate()
锁定特定行,直到它成功提交 ( Select * from invoices where id=1 FOR UPDATE
)。但select * from invoices where id=2 FOR UPDATE
不应该等到第一个查询被提交。同样,如果没有指定锁 ( Select * from invoices
),则不会绘制记录,它会等待提交第一个事务。锁定整个表而不是单行的可能原因是什么?
在7.x中,当您锁定单行时,整个记录(表)都会被锁定!