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(); 
+0

'sleep(20)'将等待20秒,而不是分钟 – 2018-02-23 08:16:34