Ваши два примера функционально эквивалентны, но это не то, к чему относится цитируемая фраза.
Упомянутая вами цитата взята из главы «Транзакции и параллелизм», конкретно к явно разграниченным транзакциям .
Цитата относится к такому виду кода:
$em->getConnection()->beginTransaction(); // suspend auto-commit
try {
//... do some work
$user = new User;
$user->setName('George');
$em->persist($user);
$em->flush();
$em->getConnection()->commit();
} catch (Exception $e) {
$em->getConnection()->rollBack();
throw $e;
}
В этом случае транзакция сначала разграничивается вызовами beginTransaction()
и commit()
.
Если вы не используете для этого блок catch
, вы не сможете выдать rollBack()
и оставите транзакцию открытой. Да, он may
автоматически откатывается при закрытии соединения, но лучше, если вы сделаете это явно.
И повторное исключение желательно, чтобы вы могли сообщить потребителям, что что-то пошло не так с транзакцией и сделайте правильную обработку ошибок. Вы также можете выдать другой тип исключения или выполнить другой тип обработки ошибок.