1

我正在尝试使用 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 秒的延迟......

有人看到我错了吗?

谢谢。

4

2 回答 2

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));
}
于 2014-10-08T08:30:29.813 回答
0

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

$m = $em->getConnection()->query($sql)->fetch();
sleep(20);
$em->getConnection()->commit();
于 2014-10-07T17:25:29.543 回答