2016-12-30 6 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

soft delete также являются плохой практикой, ИМХО. – 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)

Смежные вопросы