DBAL Connection query()函数和SELECT FOR UPDATE,LOCK

时间:2014-10-07 16:53:06

标签: mysql doctrine locking dbal

我试图做一个“选择更新”'使用DBAL连接查询函数在mysql中查询。

我参与了一个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),并在另一个标签中调用了第二个url(test2)。

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

有人看到我错在哪里吗?

感谢。

2 个答案:

答案 0 :(得分:1)

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

/**
 * @Route("test2", name="test2")
 */
public function test2Action()
{
    $em = $this->getDoctrine()->getManager();
    $em->getConnection()->beginTransaction();
        $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));
}

答案 1 :(得分:0)

你需要等待20分钟,所以加上睡眠(20):

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