AL+

Limba: RO (română) EN (English)

Scrieți-ne: paul@alplustech.com

O replică PostgreSQL sănătoasă poate avea date prea vechi pentru citire

Citirea după scriere cere aplicarea jurnalului până la poziția scrierii confirmate sau citirea de pe primar; beta PostgreSQL pune în lumină acest contract.

Read this article in English

O citire imediat după o scriere aduce o așteptare pe care o citire obișnuită poate să nu o aibă: ar trebui să includă modificarea tocmai confirmată. Trimiterea cererii către o replică sănătoasă nu îndeplinește această așteptare. Aplicația are nevoie de o condiție privind poziția până la care a fost aplicat jurnalul, legată de scriere, sau trebuie să citească de pe serverul primar. Disponibilitatea și actualitatea datelor răspund la întrebări diferite.

Distincția trebuie exprimată în contractul cererii. Dacă un utilizator salvează o modificare, iar ecranul următor poate afișa în mod legitim date mai vechi, produsul ar trebui să definească acest comportament. Dacă ecranul promite să arate modificarea, rutarea are nevoie de suficiente informații pentru a respecta promisiunea. O regulă generică de distribuire a citirilor nu poate deduce de ce scrieri depinde o anumită cerere.

Versiunea beta a făcut vizibilă condiția

Anunțul PostgreSQL 19 Beta 1 din 4 iunie 2026 prezintă preliminar WAIT FOR LSN pentru citirea propriilor modificări. Scopul este așteptarea aplicării jurnalului până la o anumită poziție, înaintea interogării. Anunțul oferă dovezi despre o versiune beta și descurajează explicit folosirea versiunilor beta în producție. Nu este o recomandare de instalare a acelei versiuni.

Ideea de proiectare rămâne utilă independent de lansare: o citire dependentă are nevoie de dovada că serverul ales a aplicat modificarea relevantă. Un server poate fi accesibil și poate răspunde la interogări, deși nu a ajuns încă la acel punct. O verificare de sănătate poate stabili disponibilitatea serviciului fără să stabilească îndeplinirea condiției prealabile a acestei citiri.

Un exemplu ipotetic de editare a unui document arată consecința. Serverul primar confirmă salvarea unui titlu. Cererea următoare deschide documentul prin altă conexiune și ajunge la o replică ce nu a aplicat încă înregistrarea de confirmare a tranzacției. O interogare reușită poate returna titlul vechi. Succesul transportului și al interogării nu dovedesc, singure, comportamentul promis de citire după scriere.

Condiția relevantă este aplicarea jurnalului

Un contract privind actualitatea datelor are nevoie de o poziție care acoperă scrierea confirmată. Condiția trebuie aplicată și serverului care va servi citirea dependentă. Așteptarea pe o replică urmată de trimiterea interogării către alta ar pierde dovada tocmai obținută. Cererea trebuie să păstreze legătura dintre condiția prealabilă și operația pe care o permite.

Referința PostgreSQL 19 pentru WAIT, consultată la 9 noiembrie 2026, este documentație ulterioară, pentru care nu a fost observată o dată de publicare. Distincția ei dintre modurile replay, write și flush ajută la explicarea contractului. Primirea sau stocarea durabilă a înregistrărilor jurnalului nu înseamnă aplicarea lor astfel încât interogările să le vadă efectele. Sintaxa exactă și detaliile despre expirarea așteptării din acea referință nu ar trebui atribuite retroactiv API-ului beta din iunie.

Referința ulterioară cere și o poziție potrivită, care să acopere confirmarea tranzacției, pentru citirea propriilor modificări. Aplicația nu poate alege o poziție anterioară oarecare din jurnal și să presupună că include tranzacția. La limita dintre operații trebuie transmisă o dovadă despre scrierea confirmată, nu doar un număr observat recent.

Chiar și o așteptare reușită necesită ca citirea următoare să folosească o imagine potrivită a datelor. O imagine fixată înainte de modificarea relevantă poate împiedica rezultatul dorit. Acesta este încă un motiv pentru a trata așteptarea și citirea drept părți ale aceleiași operații proiectate, nu utilitare independente plasate undeva pe traseul cererii.

Așteptarea are nevoie de un rezultat pentru eșec

Când replicarea întârzie, așteptarea consumă din timpul disponibil pentru răspuns. Expirarea trebuie, așadar, să aibă un sens definit pentru apelant. Nu poate fi interpretată în tăcere drept dovadă că aplicarea jurnalului s-a încheiat. Produsul poate alege citirea de pe primar, o stare vizibilă de reîncercare sau alt răspuns explicit la eșec când condiția prealabilă nu este îndeplinită.

Alternativele au costuri diferite. Returnarea unor date mai vechi poate fi acceptabilă pentru o pagină de navigare cu o toleranță documentată. Contractul este diferit de confirmarea rezultatului editării făcute de utilizator. Aplicația ar trebui să decidă ce contract se aplică înainte să aleagă durata așteptării sau destinația folosită în caz de eșec.

Contraargumentul cel mai puternic împotriva așteptării replicii este că păstrarea următoarei citiri pe primar poate fi mai ieftină și mai simplă. Pentru un număr limitat de citiri dependente, transmiterea unui indicator de poziție și coordonarea așteptării pot adăuga mai multă complexitate decât economisesc. Când întârzierea persistă, evitarea așteptării poate împiedica și consumarea celei mai mari părți din timpul cererii pentru o condiție care probabil nu se va îndeplini la timp.

Nu este o recomandare universală de a citi exclusiv de pe primar. Citirile care tolerează date mai vechi pot beneficia în continuare de alt traseu. Ideea este să le separați de cererile a căror corectitudine depinde de o anumită scriere. Comparați complexitatea și timpul de răspuns ale celor două variante după cerințele reale ale sarcinilor, fără a presupune că replica este întotdeauna destinația mai economică.

Disponibilitatea în mediul de previzualizare nu a schimbat contractul producției

AWS a anunțat disponibilitatea în mediul RDS de previzualizare la 8 iunie, după anunțul comunității despre beta. Furnizorul descria instanțe păstrate cel mult 60 de zile înaintea ștergerii automate și copii snapshot care puteau fi restaurate doar în acel mediu. Aceste limite istorice întăresc distincția dintre evaluarea unei funcționalități și adoptarea unei dependențe pentru producție.

Un mediu de previzualizare administrat nu dovedește corectitudinea aplicației și nu elimină necesitatea unui plan de extragere a datelor de evaluare. El oferă un loc pentru evaluarea unei versiuni preliminare, în condiții precizate. Nu spune dacă un anumit produs a ales o condiție validă de aplicare a jurnalului, a tratat expirarea sau a păstrat legătura dintre așteptare și citire.

În dezvoltarea software la comandă, definiți promisiunea următoarei citiri alături de operația de salvare. Precizați ce modificări trebuie să fie vizibile, ce dovadă permite citirea de pe replică și ce se întâmplă dacă dovada lipsește. Decideți apoi dacă o așteptare coordonată sau o citire de pe primar îndeplinește mai simplu acea promisiune.