Рассматривая разные примеры по транзакциям, обратил внимание, что commit() указан в секции try, а rollBack() в catch Но как быть если в коде уже есть обработчик ошибок, написание try / catch не целесообразно! В мануале написано: Т.е. после commit() нужно установить проверку через IF? Если PDO::commit FALSE тогда вызвать rollBack() ? Будет ли это верным? PHP: $dbh->beginTransaction(); /* Вставка множества записей */ $commit = $dbh->commit(); if($commit === FALSE) $dbh->rollBack();
вижу несколько вариантов как минимум - обработать исключение в catch, те сделать rollback, и опять кинуть исключение, уже для внешнего обработчика. - кидать кастомное исключение, а во внешнем обработчике, анализировать его тип и делать соответствующие действия. роллбак, логгирование, юзер френдли мессадж....
кусок с моего PHP: public static function prepare( ...$args ): Lerma { try { if ( empty ( $args[1] ) ) { throw new Error( 'Данные пусты. Используйте функцию query' ); } $sql = static :: instance() -> dead() -> replaceHolders( is_string ( $args[0] ) ? $args[0] : sprintf ( ...$args[0] ) ); if ( strpbrk ( $sql, '?:' ) === false ) { throw new Error( 'Метки параметров запроса отсутствуют. Используйте функцию query' ); } static :: instance() -> drivers[static :: instance() -> config -> default] -> prepare( $sql ); static :: instance() -> config -> fast ?: static :: instance() -> drivers[static :: instance() -> config -> default] -> isError(); static :: instance() -> execute( $args[1] ); } catch ( Throwable $t ) { static :: instance() -> drivers[static :: instance() -> config -> default] -> rollBack(); static :: instance() -> exceptionIDriver( $t ); } return static :: instance(); }
Т.е. использовать try/catch имея собственный класс обработки ошибок/исключений это является нормально практикой? Просто я почему-то считал, что одна из задач классов обработки ошибок как раз и состоит в том, что я не использую в try/catch явно, а вызываю в исключительных ситуациях PHP: throw new \Exception("Описание ошибки", 000);