一个简单的问题。
如果我使用DB :: transactions()并执行以下操作:
DB::transaction(function()
{
$result =
DB::table('orders')->select('id')->where('id', '>', 17)->lockForUpdate()->get();
});
如果我在完全相同的瞬间执行此脚本会怎样?
Laravel说:
或者,您可以使用lockForUpdate方法。一个“用于更新” 锁定可防止修改行或选择 另一个共享锁。
lockForUpdate是否会阻止同时发生读取,还是仅在对行执行以下UPDATE时才会影响读取?
我可以保证如果脚本已从该行读取,那么在同一毫秒内的并发脚本将失败,并等待事务在尝试运行代码之前释放锁?
我在任何地方都找不到超级清晰的答案,所有示例都在尝试更新或插入。我只想防止并发选择。
答案 0 :(得分:0)
这是一个旧主题,但是由于没有答案,这是我的输入。我也遇到过类似的情况,经过几次T&E,终于锁定了表记录,该表记录打算在给定时间仅由一个排他性事务修改。
也许不值得一提,您的表存储引擎是否设置为InnoDB?因为几次尝试失败后,我发现我的表存储引擎是MyISAM。