sql >> Database teknologi >  >> RDS >> PostgreSQL

Autorollback i postgres ved hjælp af PDO

Det er ikke PDO's skyld, det er iboende til PostgreSQL's transaktionsstyring. Se:

PostgreSQL ruller ikke transaktionen tilbage, men den sætter den til en afbrudt tilstand, hvor den kun kan rulle tilbage, og hvor alle udsagn undtagen ROLLBACK rapporter en fejl:

(Jeg er overrasket over ikke at finde dette refereret i den officielle dokumentation; tror jeg bliver nødt til at skrive en patch for at forbedre det.)

Så. Når du prøver/fanger og sluger undtagelsen i PDO, fanger du en undtagelse på PHP-siden, men du ændrer ikke på det faktum, at PostgreSQL-transaktionen er i en afbrudt tilstand.

Hvis du ville være i stand til at sluge undtagelser og blive ved med at bruge transaktionen, skal du opret et SAVEPOINT før hver udsagn, der kan mislykkes. Hvis det mislykkes, skal du ROLLBACK TO SAVEPOINT ...; . Hvis det lykkes, kan du RELEASE SAVEPOINT ...; . Dette pålægger databasen ekstra overhead til transaktionsstyring, tilføjer rundrejser og gennembrænder transaktions-id'er hurtigere (hvilket betyder, at PostgreSQL skal udføre mere baggrundsoprydningsarbejde).

Det er generelt at foretrække i stedet at designe din SQL, så den ikke fejler under normale omstændigheder. For eksempel kan du validere de fleste begrænsninger på klientsiden, behandle begrænsningerne på serversiden som et andet sikkerhedsniveau, mens du fanger de fleste fejl på klientsiden.

Hvor det er upraktisk, gør din applikation fejltolerant, så den kan prøve en mislykket transaktion igen. Nogle gange er dette alligevel nødvendigt - for eksempel kan du generelt ikke bruge savepoints til at gendanne efter dødvande transaktionsafbrydelser eller serialiseringsfejl. Det kan også være nyttigt at holde transaktioner, der er udsat for fejl, så korte som muligt, ved at udføre det mindste arbejde, der kræves, så du har mindre at holde styr på og gentage.

Så:Hvor det er muligt, i stedet for at sluge en undtagelse, skal du køre fejltilbøjelig databasekode i en genforsøgsløkke. Sørg for, at din kode registrerer de oplysninger, den skal bruge for at prøve hele transaktionen igen ved fejl, ikke kun den seneste erklæring.

Husk enhver transaktion kan mislykkes:DBA'en genstarter muligvis databasen for at anvende en patch, systemet løber måske tør for RAM på grund af et løbsk cron-job osv. Så fejltolerante apps er alligevel et godt design.

Rekvisitter til dig for i det mindste at bruge PDO-undtagelser og håndtering af undtagelser - du er allerede langt foran de fleste udviklere.




  1. bruge en database til logning

  2. Tilslutning af PowerShell til Salesforce.com

  3. 8000 opdateringer i sekundet ved hjælp af mysql

  4. Hvordan opregner man alle aktiverede roller for alle brugere i PostgreSQL?