这个问题可能过于宽泛,但。所以网站使用共同的数据库,如果在第2行:PHP,请求时锁定数据库?
\Doctrine\Repository::getUser()->findById(1)
是好的,但该用户可能会被删除。所以6行之后,在第8行:
\Doctrine\Repository::getUser()->findById(1)
会抛出异常!一个通用的解决方案是在请求正在进行时阻止DELETE/UPDATE命令。但如何?
这个问题可能过于宽泛,但。所以网站使用共同的数据库,如果在第2行:PHP,请求时锁定数据库?
\Doctrine\Repository::getUser()->findById(1)
是好的,但该用户可能会被删除。所以6行之后,在第8行:
\Doctrine\Repository::getUser()->findById(1)
会抛出异常!一个通用的解决方案是在请求正在进行时阻止DELETE/UPDATE命令。但如何?
在我的经验,这是不好的做法,从数据库中完全删除任何数据。看作公司的大数据是一件重要的事情。所以我建议使用一个布尔值来“删除”东西,这样你就可以回头看看用户和其他东西。但是,如果你真的要删除的用户处理异常
应该去像
if(getUser->findById(1)){
getUser->findById(1);
}else{
return "some error message" ;
}
软删除恕我直言,这也是一种不好的做法。 – Federkun
诚然,我习惯了这样的公司我在想它做这样的工作,不是说这是理想的只是一种选择。 – KevinTheGreat
修改例如,对于你的情况:
$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
)
另一种解决方案是处理例外。 – gbestard
或'SELECT FOR UPDATE'和东西 – Federkun
看看锁定:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/transactions-and-concurrency.html – lxg