Laravel LockforUpdate误解选择

时间:2019-02-20 00:38:10

标签: mysql database concurrency laravel-4 transactions

一个简单的问题。

如果我使用DB :: transactions()并执行以下操作:

DB::transaction(function()
{
  $result = 
    DB::table('orders')->select('id')->where('id', '>', 17)->lockForUpdate()->get();
});

如果我在完全相同的瞬间执行此脚本会怎样?

Laravel说:

  

或者,您可以使用lockForUpdate方法。一个“用于更新”   锁定可防止修改行或选择   另一个共享锁。

lockForUpdate是否会阻止同时发生读取,还是仅在对行执行以下UPDATE时才会影响读取?

我可以保证如果脚本已从该行读取,那么在同一毫秒内的并发脚本将失败,并等待事务在尝试运行代码之前释放锁?

我在任何地方都找不到超级清晰的答案,所有示例都在尝试更新或插入。我只想防止并发选择。

1 个答案:

答案 0 :(得分:0)

这是一个旧主题,但是由于没有答案,这是我的输入。我也遇到过类似的情况,经过几次T&E,终于锁定了表记录,该表记录打算在给定时间仅由一个排他性事务修改。

也许不值得一提,您的表存储引擎是否设置为InnoDB?因为几次尝试失败后,我发现我的表存储引擎是MyISAM。