DBAL连接查询()函数和SELECT FOR UPDATE,锁
问题描述:
我想在mysql中使用DBAL连接查询函数做一个'SELECT FOR UPDATE'查询。DBAL连接查询()函数和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));
}
我打电话的第一个网址(测试)我浏览器并立即在另一个选项卡中显示第二个(test2)。
我的问题是,第二个返回立刻答案,而无需等待20秒的延迟......
难道有人看到我错了?
谢谢。
答
我发现我的错误,SELECT FOR UPDATE查询只锁定该行的其他SELECT FOR UPDATE查询,而不是对于正常的SELECT。我错过了解基本定义。要使测试有效,第二个动作应该看起来像这样:
/**
* @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));
}
答
你需要把它等待20分钟,所以补充睡眠(20):
$m = $em->getConnection()->query($sql)->fetch();
sleep(20);
$em->getConnection()->commit();
'sleep(20)'将等待20秒,而不是分钟 – 2018-02-23 08:16:34