2016-12-30 60 views
2

这个问题可能过于宽泛,但。所以网站使用共同的数据库,如果在第2行:PHP,请求时锁定数据库?

\Doctrine\Repository::getUser()->findById(1) 

是好的,但该用户可能会被删除。所以6行之后,在第8行:

\Doctrine\Repository::getUser()->findById(1) 

会抛出异常!一个通用的解决方案是在请求正在进行时阻止DELETE/UPDATE命令。但如何?

+5

另一种解决方案是处理例外。 – gbestard

+1

或'SELECT FOR UPDATE'和东西 – Federkun

+1

看看锁定:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/transactions-and-concurrency.html – lxg

回答

0

在我的经验,这是不好的做法,从数据库中完全删除任何数据。看作公司的大数据是一件重要的事情。所以我建议使用一个布尔值来“删除”东西,这样你就可以回头看看用户和其他东西。但是,如果你真的要删除的用户处理异常

应该去像

if(getUser->findById(1)){ 
    getUser->findById(1); 
}else{ 
    return "some error message" ; 
} 
+3

软删除恕我直言,这也是一种不好的做法。 – Federkun

+1

诚然,我习惯了这样的公司我在想它做这样的工作,不是说这是理想的只是一种选择。 – KevinTheGreat

2

这就是交易是。见http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/transactions-and-concurrency.html#approach-2-explicitly

修改例如,对于你的情况:

$em->getConnection()->beginTransaction(); // suspend auto-commit 
try { 
    \Doctrine\Repository::getUser()->findById(1) 
    //... do some work 
    \Doctrine\Repository::getUser()->findById(1) 
    // you're done with that particular user 
    $em->getConnection()->commit(); 
} catch (Exception $e) { 
    $em->getConnection()->rollBack(); 
    throw $e; 
} 

要小心,你的版本库使用的EntityManager的正确的实例($em