我试图做一个“选择更新”'使用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秒的延迟......
有人看到我错在哪里吗?
感谢。
答案 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();