Рейтинг:1

Откатывается ли транзакция базы данных, если тайм-аут PHP/Gateway/соединение сброшено/потеряно?

флаг ca

Я использую Drupal за обратным уровнем прокси/кеша (например, Cloud Front/Akamai), и иногда служба работает довольно медленно (поэтому я получаю тайм-аут шлюза по таким причинам, как слишком много людей используют серверы) или что-то плохое происходит в ферме серверов (микроархитектура докера) и поэтому я получаю 502 Bad Gateway.

Знаем ли мы, будет ли в таких случаях откатываться транзакция базы данных? Это особенно актуально при выполнении более 800 обновлений сущностей через пакетный API.

Например. (на основе фиктивного кода: https://www.drupal.org/docs/drupal-apis/database-api/database-transactions)


$transaction = $connection->startTransaction();

пытаться {
  // Делаем что-то, что записывает в базу данных.
  $entity = create_some_entity();
  $сущность->сохранить();

  // Притворимся, что здесь произошел 502 Bad Gateway или тайм-аут шлюза.

  // Сделать еще одну запись в базу данных, которая зависит от первой.
  $зависимая_сущность = update_зависимая_сущность($сущность->id());
  $зависимая_сущность->сохранить();
}
поймать (\ Исключение $e) {
  // Произошла ошибка записи в БД, поэтому БД откатывается
  // в состояние, когда транзакция была запущена.
  // Не уверен, что перехват исключения что-нибудь здесь сделает.
  // (поскольку исключений не ожидается)
  $транзакция->откат();
}

// Зафиксировать транзакцию, сбросив переменную $transaction.
отменить ($ транзакция);
Рейтинг:2
флаг us

Транзакция откатывается только тогда, когда Транзакция:: откат() явно называется. В случае тайм-аутов этого не происходит.
На самом деле, в этом случае изменения базы данных даже не фиксируются, так как это происходит только тогда, когда Транзакция::__destruct() называется.

общественная функция __destruct() {
  // Если бы мы откатились, то транзакция уже была бы вытолкнута.
  если (!$this->rolledBack) {
    $this->connection->popTransaction($this->name);
  }
}
флаг ca
Как быть в случае отключения пользователя (веб-браузера) или отключения обратного прокси-сервера (чтобы время ожидания PHP не истекло)
apaderno avatar
флаг us
Если сервер настроен на ожидание данных от соединения с базой данных меньше времени, необходимого для истечения времени ожидания PHP, транзакцию следует откатить (при условии, что время ожидания соединения с базой данных вызывает исключение PHP). В противном случае PHP истечет время ожидания ответа, который никогда не вернется (и никаких исключений не возникнет). Кроме того, поскольку это пакетная обработка, когда браузер теряет соединение с сервером, пакетная обработка прерывается.
флаг ca
Эти утверждения предполагают, что транзакция будет отменена в случае сбоя процесса PHP или сбоя сетевого соединения между PHP и сервером MySQL. вы явно не совершили транзакцию, тогда предполагается, что что-то пошло не так, поэтому откат выполняется для безопасности ваших данных.` (https://www.php.net/manual/en/pdo.transactions. php). [...]
флаг ca
«Это означает, что если ваш сеанс отключается по какой-либо причине, либо по собственному выбору, либо из-за ошибки, например, сбоя сетевого подключения и т. Д., Текущая транзакция откатывается» (https://dba.stackexchange.com). /a/60005), «Я знаю, что транзакция будет отброшена, если соединение прервется до фиксации» (https://dba.stackexchange.com/q/215579). всегда откатывается в конце сеанса.` (https://stackoverflow.com/a/65213497/5150644)
флаг ca
Тогда я прав, предполагая, что Drupal выполняет откат в этом случае (ошибка PHP или разрыв соединения)? И ваш ответ, ответ утвердительный? (транзакция по существу «откатывается», поскольку операторы никогда не фиксируются в первую очередь)?

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.