Puncte:1

Se efectuează rollback-ul unei tranzacții de bază de date dacă are loc un timeout PHP/Gateway/conexiune întreruptă/pierdută?

drapel ca

Folosesc Drupal în spatele unui strat proxy/cache inversat (de exemplu, Cloud Front/Akamai) și uneori serviciul merge destul de lent (deci primesc un timeout Gateway, din motive precum prea multe persoane folosesc serverele) sau se întâmplă ceva rău în ferma de servere (micro-arhitectură docker) și astfel am un 502 Bad Gateway.

Știm dacă o tranzacție de bază de date va fi anulată în astfel de cazuri? Acest lucru este relevant în special atunci când se efectuează actualizări de peste 800 de entități prin API-ul Batch.

De exemplu. (pe baza codului simulat: https://www.drupal.org/docs/drupal-apis/database-api/database-transactions)


$tranzacție = $conexiune->startTransaction();

încerca {
  // Faceți ceva care scrie în baza de date.
  $entity = create_some_entity();
  $entity->salvare();

  // Pretindeți-vă că aici s-a întâmplat o expirare 502 Bad Gateway sau Gateway.

  // Efectuați o altă scriere de bază de date care depinde de prima.
  $dependent_entity = update_dependent_entity($entity->id());
  $entitate_dependenta->salvare();
}
captură (\Excepție $e) {
  // A apărut o eroare la scrierea în baza de date, deci baza de date este anulată
  // la starea când tranzacția a fost începută.
  // Nu sunt sigur dacă prinderea unei excepții va face ceva aici.
  // (deoarece nu se așteaptă nicio excepție)
  $tranzacție->rollBack();
}

// Se comite tranzacția prin dezactivarea variabilei $tranzacție.
unset($tranzacție);
Puncte:2
drapel us

O tranzacție este anulată numai când Tranzacție::rollBack() este denumit în mod explicit. În caz de time out, asta nu se întâmplă.
De fapt, în acest caz, modificările bazei de date nici măcar nu sunt comise, deoarece asta se întâmplă doar când Tranzacție::__destruct() se numește.

funcția publică __destruct() {
  // Dacă am revenit, tranzacția ar fi fost deja făcută.
  if (!$this->rolledBack) {
    $this->connection->popTransaction($this->name);
  }
}
drapel ca
Dar în cazul deconectării utilizatorului (browser-ului web) sau a deconectarii proxy-ului invers (deci PHP nu a expirat)
apaderno avatar
drapel us
Dacă serverul este setat să aștepte date de la o conexiune la baza de date mai puțin decât timpul necesar pentru ca PHP să expire, tranzacția ar trebui să fie anulată (presupunând că o expirare a conexiunii la baza de date cauzează o excepție PHP). În caz contrar, PHP va expira în așteptarea unui răspuns care nu se întoarce niciodată (și nu se ridică nicio excepție). De asemenea, din moment ce este procesare batch, atunci când browserul pierde conexiunea cu serverul, procesarea batch este întreruptă.
drapel ca
Aceste afirmații par să sugereze că tranzacția va fi anulată în cazul în care procesul PHP se blochează sau în cazul eșecului conexiunii la rețea între PHP și serverul MySQL „Aceasta este o măsură de siguranță pentru a ajuta la evitarea inconsecvenței în cazurile în care scriptul se termină în mod neașteptat, dacă nu ați comis în mod explicit tranzacția, atunci se presupune că ceva a mers prost, așa că rollback-ul este efectuat pentru siguranța datelor dvs.` (https://www.php.net/manual/en/pdo.transactions. php). [...]
drapel ca
„Aceasta înseamnă că dacă sesiunea dvs. se deconectează din orice motiv, fie prin alegere, fie pentru că apare o eroare, cum ar fi conexiunea la rețea, etc., atunci o tranzacție în curs este anulată.” (https://dba.stackexchange.com /a/60005), „Știu că tranzacția va fi anulată dacă conexiunea se întrerupe înainte de comitere.” (https://dba.stackexchange.com/q/215579) „Dacă ați dezactivat autocommit-ul, orice tranzacție necomitată este întotdeauna anulat la sfârșitul sesiunii.` (https://stackoverflow.com/a/65213497/5150644)
drapel ca
Deci, am dreptate să sugerez că Drupal face rollback în acest caz (eroare PHP sau conexiune întreruptă)? De asemenea, răspunsul tău este afirmativ? (tranzacția este în esență „retrocedată”, deoarece declarațiile nu sunt niciodată comise în primul rând) ?

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.