【问题标题】:DBAL Connection query() function and SELECT FOR UPDATE, LOCKDBAL Connection query() 函数和 SELECT FOR UPDATE, LOCK
【发布时间】:2014-12-02 04:27:42
【问题描述】:

我正在尝试使用 DBAL 连接查询功能在 mysql 中执行“SELECT FOR UPDATE”查询。

我在一个 symfony 项目中,我做了以下测试:

我的控制器中有这两个功能:

/**
 * @Route("test", name="test")
 */
public function testAction()
{
    $em = $this->getDoctrine()->getManager();
    $em->getConnection()->beginTransaction();
    try {
        $sql = "SELECT *
            FROM CommandeDel
            WHERE IDCommande = 2 FOR UPDATE";
        $m = $em->getConnection()->query($sql)->fetch();
        sleep(20);
        $em->getConnection()->commit();
    }
    catch (\Exception $e) {
        $em->getConnection()->rollback();
        throw $e;
    }

    return new Response(json_encode($m));
}

/**
 * @Route("test2", name="test2")
 */
public function test2Action()
{
    $em = $this->getDoctrine()->getManager();
    $em->getConnection()->beginTransaction();
        $sql = "SELECT *
            FROM CommandeDel
            WHERE IDCommande = 2";
        $m = $em->getConnection()->query($sql)->fetch();
        $em->getConnection()->commit();
    }
    catch (\Exception $e) {
        $em->getConnection()->rollback();
        throw $e;
    }

    return new Response(json_encode($m));
}

我在浏览器中调用第一个 url (test),然后在另一个选项卡中立即调用第二个 (test2)。

我的问题是第二个立即返回答案而无需等待 20 秒的延迟...

有人看出我哪里错了吗?

谢谢。

【问题讨论】:

    标签: mysql doctrine locking dbal


    【解决方案1】:

    我发现我的错误,SELECT FOR UPDATE 查询只为其他 SELECT FOR UPDATE 查询锁定该行,而不是普通 SELECT。我想念基本定义。为了使测试有效,第二个 Action 应该如下所示:

    /**
     * @Route("test2", name="test2")
     */
    public function test2Action()
    {
        $em = $this->getDoctrine()->getManager();
        $em->getConnection()->beginTransaction();
        try {
            $sql = "SELECT *
                FROM CommandeDel
                WHERE IDCommande = 2 FOR UPDATE";
            $m = $em->getConnection()->query($sql)->fetch();
            $em->getConnection()->commit();
        }
        catch (\Exception $e) {
            $em->getConnection()->rollback();
            throw $e;
        }
    
        return new Response(json_encode($m));
    }
    

    【讨论】:

      【解决方案2】:

      你需要让它等待 20 分钟,所以添加 sleep(20):

      $m = $em->getConnection()->query($sql)->fetch();
      sleep(20);
      $em->getConnection()->commit();
      

      【讨论】:

      • sleep(20) 将等待 20 秒,而不是几分钟
      • 是的,我的意思是等待 20 秒,代码没问题,虽然只是我的解释。谢谢。
      猜你喜欢
      • 2013-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-28
      • 1970-01-01
      • 1970-01-01
      • 2020-08-28
      • 1970-01-01
      相关资源
      最近更新 更多