0

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中,当您锁定单行时,整个记录(表)都会被锁定!

4

0 回答 0