【问题标题】:Laravel lockforupdate misunderstanding SELECTSLaravel lockforupdate 误解 SELECTS
【发布时间】:2019-07-13 14:18:36
【问题描述】:

简单的问题。

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

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

如果我在完全相同的瞬间执行此脚本会发生什么?

Laravel 说:

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

lockForUpdate 是否会阻止读取同时发生,还是仅在对行执行后续 UPDATE 时才起作用?

我能否保证如果脚本已经从该行读取,那么同一毫秒的并发脚本将失败并等待事务释放锁,然后再尝试运行代码?

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

【问题讨论】:

  • 我正在运行并发测试,并且 SELECT 之后的行似乎发生在同一毫秒。这意味着它没有按预期锁定行?

标签: mysql database concurrency laravel-4 transactions


【解决方案1】:

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

可能不值得一提,你的表存储引擎设置为 InnoDB 了吗?因为在几次尝试失败后,我发现我的表存储引擎是 MyISAM。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-06
    • 2023-01-10
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    • 2012-12-04
    • 2013-08-25
    • 1970-01-01
    相关资源
    最近更新 更多