SQLite 3.51.3 cu corectura posibilei deteriorări a bazei de date în modul WAL

SQLite 3.51.3 cu corectura posibilei deteriorări a bazei de date în modul WAL

Pe 13 martie a avut loc o lansare corectivă a versiuni 3.51.3 a SGBD-ului compact încorporat SQLite. Codul proiectului este scris în limbajul C și este distribuit ca domeniu public.

Din cauza problemelor de compatibilitate înapoi legate de anumite funcții noi, versiunea 3.52.0 (lansată pe 6 martie) a fost retrasă.

Lista modificărilor versiunii 3.51.3:

  • Pe 3 martie, unul dintre dezvoltatorii SQLite (Dan) a descoperit și a remediat o eroare care, în cazuri rare, putea conduce la deteriorarea bazei de date și a fost numită «eroarea RESET WAL»:
    • Această eroare apare doar în bazele de date care funcționează în modul WAL, dacă același fișier este deschis de două sau mai multe conexiuni în fire sau procese diferite și dacă aceste două conexiuni încearcă să execute o scriere sau să creeze un punct de control în același timp.
    • Eroarea este legată de un conflict de acces la date în condiții stricte de timp. În condiții normale de utilizare, aceasta apare extrem de rar. Dezvoltatorii nu au reușit să reproducă această eroare în condiții naturale și au fost nevoiți să adauge în SQLite o logică specială de testare care creează intenționat condiții pentru a provoca eroarea, pentru a se asigura că problema a fost rezolvată.
    • Eroarea apare atunci când:
      1. O conexiune execută controlul punctului de control. Această prima verificare trebuie finalizată. Cu alte cuvinte, în timpul verificării trebuie să se copieze cu succes tot conținutul fișierului WAL înapoi în baza de date și să se aducă fișierul WAL într-o stare în care poate fi resetat.
      2. Imediat după terminarea primei verificări de control, începe a doua.
      3. În timp ce a doua verificare de control din pasul 2 este în curs de desfășurare, o altă conexiune la baza de date înregistrează o tranzacție care resetează fișierul WAL și scrie un nou conținut la începutul fișierului WAL.
      4. Din cauza conflictului de acces la date, a doua verificare de control din pasul 2 nu ia în considerare faptul că fișierul WAL a fost resetat ca urmare a înregistrării tranzacției din pasul 3. A doua verificare de control stabilește o valoare incorectă pentru unul dintre câmpurile din antetul WAL. Acest câmp indică faptul că o parte a fișierului WAL a fost deja înregistrată în punctul de control, deși în realitate nu este așa.
      5. Fixarea tranzacțiilor suplimentare duce la creșterea numărului de pagini din fișierul WAL, care depășește numărul de pagini existente în momentul primului punct de verificare din pasul 1.
      6. Mai târziu, când apare un al treilea punct de verificare, este posibil să săriți toată sau o parte dintr-o tranzacție înregistrată în etapa 3. Astfel, părți din tranzacția de la etapa 3 nu ajung în fișierul bazei de date, ceea ce duce la deteriorarea acestuia.
    • Eroarea este probabil prezentă în toate versiunile SQLite, începând cu 3.7.0 (21.07.2010) și terminând cu 3.51.2. De asemenea, au fost emise corecții pentru unele versiuni anterioare: 3.44.6 și 3.50.7.
  • Alte corecții minore.

Sursa: linux.org.ru

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster