За последние 24 часа нас посетили 22426 программистов и 1151 робот. Сейчас ищет 641 программист ...

PDO commit() и rollBack() в транзакции

Тема в разделе "PHP для новичков", создана пользователем AlexandrS, 8 июн 2019.

  1. AlexandrS

    AlexandrS Активный пользователь

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    Рассматривая разные примеры по транзакциям, обратил внимание, что commit() указан в секции try, а rollBack() в catch
    Но как быть если в коде уже есть обработчик ошибок, написание try / catch не целесообразно!

    В мануале написано:
    Т.е. после commit() нужно установить проверку через IF?
    Если PDO::commit FALSE тогда вызвать rollBack() ?

    Будет ли это верным?

    PHP:
    1. $dbh->beginTransaction();
    2.  
    3. /* Вставка множества записей  */
    4.  
    5. $commit = $dbh->commit();
    6.  
    7. if($commit === FALSE)  $dbh->rollBack();
     
  2. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    вижу несколько вариантов как минимум
    - обработать исключение в catch, те сделать rollback, и опять кинуть исключение, уже для внешнего обработчика.
    - кидать кастомное исключение, а во внешнем обработчике, анализировать его тип и делать соответствующие действия. роллбак, логгирование, юзер френдли мессадж....
     
    AlexandrS нравится это.
  3. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.751
    Симпатии:
    1.322
    Адрес:
    Лень
    кусок с моего
    PHP:
    1. public static function prepare( ...$args ): Lerma
    2.     {
    3.         try
    4.         {
    5.             if ( empty ( $args[1] ) )
    6.             {
    7.                 throw new Error( 'Данные пусты. Используйте функцию query' );
    8.             }
    9.            
    10.             $sql = static :: instance() -> dead() -> replaceHolders( is_string ( $args[0] ) ? $args[0] : sprintf ( ...$args[0] ) );
    11.            
    12.             if ( strpbrk ( $sql, '?:' ) === false )
    13.             {
    14.                 throw new Error( 'Метки параметров запроса отсутствуют. Используйте функцию query' );
    15.             }
    16.            
    17.             static :: instance() -> drivers[static :: instance() -> config -> default] -> prepare( $sql );
    18.            
    19.             static :: instance() -> config -> fast ?: static :: instance() -> drivers[static :: instance() -> config -> default] -> isError();
    20.            
    21.             static :: instance() -> execute( $args[1] );
    22.         }
    23.         catch ( Throwable $t )
    24.         {
    25.             static :: instance() -> drivers[static :: instance() -> config -> default] -> rollBack();
    26.  
    27.             static :: instance() -> exceptionIDriver( $t );
    28.         }
    29.        
    30.         return static :: instance();
    31.     }
     
    AlexandrS нравится это.
  4. AlexandrS

    AlexandrS Активный пользователь

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    Т.е. использовать try/catch имея собственный класс обработки ошибок/исключений это является нормально практикой?
    Просто я почему-то считал, что одна из задач классов обработки ошибок как раз и состоит в том, что я не использую в try/catch явно, а вызываю в исключительных ситуациях
    PHP:
    1. throw new \Exception("Описание ошибки", 000);