Отсутствует обработка «Превышено время ожидания блокировки» в адаптере magento pdo _mysql?

Если я сравню два класса адаптера Magento Varien _Db _Adapter _Mysqli и Varien _Db _Adapter _Pdo _Mysql я могу найти некоторые различия в обработке исключений запросов метода raw _query .

<?php

class Varien_Db_Adapter_Mysqli extends Zend_Db_Adapter_Mysqli
{

//....

/**
 * Run RAW Query
 *
 * @param string $sql
 * @return Zend_Db_Statement_Interface
 */
public function raw_query($sql)
{
    $timeoutMessage = 'SQLSTATE[HY000]: General error: 1205 Lock wait timeout exceeded;      try restarting transaction';
    $tries = 0;
    do {
        $retry = false;
        try {
            $this->clear_result();
            $result = $this->getConnection()->query($sql);
            $this->clear_result();
        } catch (Exception $e) {
            if ($tries < 10 && $e->getMessage() == $timeoutMessage) {
                $retry = true;
                $tries++;
            } else {
                throw $e;
            }
        }
    } while ($retry);

    return $result;
}

//....

}

Если я сравню это с равным методом в Varien _Db _Adapter _Pdo _Mysql, я найду другую обработку ошибок. Проверяет не таймауты, а потерянные соединения.

<?php

class Varien_Db_Adapter_Pdo_Mysql  extends Zend_Db_Adapter_Pdo_Mysql implements Varien_Db_Adapter_Interface
{

//....


/**
 * Run RAW Query
 *
 * @param string $sql
 * @return Zend_Db_Statement_Interface
 * @throws PDOException
 */
public function raw_query($sql)
{
    $lostConnectionMessage = 'SQLSTATE[HY000]: General error: 2013 Lost connection to MySQL server during query';
    $tries = 0;
    do {
        $retry = false;
        try {
            $result = $this->query($sql);
        } catch (Exception $e) {
            // Convert to PDOException to maintain backwards compatibility with usage of MySQL adapter
            if ($e instanceof Zend_Db_Statement_Exception) {
                $e = $e->getPrevious();
                if (!($e instanceof PDOException)) {
                    $e = new PDOException($e->getMessage(), $e->getCode());
                }
            }
            // Check to reconnect
            if ($tries < 10 && $e->getMessage() == $lostConnectionMessage) {
                $retry = true;
                $tries++;
            } else {
                throw $e;
            }
        }
    } while ($retry);

    return $result;
}

//....

}

Это правильно? Не лучше ли проверить оба случая отказа?

Пример:

/**
 * Run RAW Query
 *
 * @param string $sql
 * @return Zend_Db_Statement_Interface
 * @throws PDOException
 */
public function raw_query($sql)
{
    $lostConnectionMessages = array(
        'SQLSTATE[HY000]: General error: 2013 Lost connection to MySQL server during query',
        'SQLSTATE[HY000]: General error: 1205 Lock wait timeout exceeded; try restarting transaction',
    );
    $tries = 0;
    do {
        $retry = false;
        try {
            $result = $this->query($sql);
        } catch (Exception $e) {
            // Convert to PDOException to maintain backwards compatibility with usage of MySQL adapter
            if ($e instanceof Zend_Db_Statement_Exception) {
                $e = $e->getPrevious();
                if (!($e instanceof PDOException)) {
                    $e = new PDOException($e->getMessage(), $e->getCode());
                }
            }
            // Check to reconnect
            if ($tries < 10 && in_array($e->getMessage(), $lostConnectionMessages)) {
                $retry = true;
                $tries++;
            } else {
                throw $e;
            }
        }
    } while ($retry);

    return $result;
}
6
задан Alex 6 July 2012 в 16:52
поделиться