2010-12-10 20 views
2

Vor langer Zeit schrieb ich eine PHP-Klasse, die Postgresql-Db-Verbindungen behandelt.
Ich habe Transaktionen zu meinen Insert/Update-Funktionen hinzugefügt und es funktioniert gut für mich. Aber kürzlich habe ich von der Funktion "pg_prepare" erfahren.
Ich bin etwas verwirrt darüber, was diese Funktion macht und ob es besser ist, zu ihr zu wechseln.PHP- und PostgreSQL-Transaktionen?

Derzeit, wenn ich einen Einsatz tun/My SQL aktualisieren sieht wie folgt aus:

$transactionSql = "PREPARE TRANSACTION ".md5(time()).";" 
        .$theUpdateOrDeleteSQL.";". 
        ."COMMIT;"; 

This will return something like: 
PREPARE TRANSACTION '4601a2e4b4aa2632167d3cc62b516e6d'; 
INSERT INTO users (username,g_id,email,password) 
      VALUES('test', '1', 'test','1234'); 
COMMIT; 

Ich habe meine Datenbank mit Beziehungen aufgebaut und ich bin mit (wenn es möglich ist):

ON DELETE CASCADE 
ON UPDATE CASCADE 

Aber ich möchte 100% sicher sein, dass die Dinge in der Datenbank sauber sind und es keine Reste gibt, wenn/wenn es einen Fehler beim Aktualisieren/Löschen oder Einfügen gibt.

Es wäre schön, wenn Sie Ihre Meinung/Erfahrung über pg_prepare teilen können, brauche ich wirklich die "Transaktion vorbereiten" und andere zusätzliche Dinge, die mir helfen könnten? :)

+3

Warum verwenden Sie 'PREPARE TRANSACTION 'genau? Hast du seine [Dokumentation] (http://www.postgresql.org/docs/current/static/sql-prepare-transaction.html) gelesen? Insbesondere der Teil über "PREPARE TRANSACTION ist nicht für den Einsatz in Anwendungen oder interaktiven Sitzungen gedacht ..."? –

+0

Yeah .. Etwas verpasst, dass vor ein paar Jahren, als ich den Treiber schrieb .. Danke für die Hilfe :) – tftd

Antwort

3

Nein, Sie brauchen keine Transaktion vorbereiten (das für verteilte Transaktionen über verschiedene Server gedacht ist - wie Milen hat bereits darauf hingewiesen,

Ich bin nicht sicher, wie die PHP-Schnittstelle behandelt das, aber wie. lange, wie Sie sicherstellen, dass Sie nicht im auto laufen Modus begehen, sollten die Dinge in Ordnung sein.

Wenn Sie nicht den automatischen Festschreibemodus steuern kann, indem Sie die Anweisungen in ein BEGIN setzen ... COMMIT Block

+0

Vielen Dank für Ihre Hilfe!:) Für diejenigen, die weitere Informationen benötigen -> http://www.postgresql.org/docs/9.0/interactive/tutorial-transactions.html – tftd

4

Nein, Sie brauchen keine 2-Phasen-Festschreibung! ...

Für eine sichere PHP-Datenbank-Handling, verwenden pg_query nicht direkt, sondern wickeln Sie es in einer speziellen Funktion, die die folgende tut:

  • öffnet die Datenbankverbindung auf dem ersten Abfrage
  • wenn persistente Verbindungen verwendet, sicherzustellen, die Verbindung ist in einem bekannten Zustand
  • register_shutdown_function auf eine Funktion, die ein ROLLBACK
  • stellen Sie sicher, autocommit gibt ausgeschaltet ist, oder einfach nur ein vor der ersten Abfrage
  • Logdatenbank Fehler einer BEGIN Ausgabe nd langsame Abfragen
  • nur verwendet pg_query_params(), die Pflege von SQL-Injektionen nimmt schön

auf diese Weise, wenn Ihr Skript abstürzt oder was auch immer, ein Rollback automatisch ausgegeben wird. Sie können nur durch explizites Commit festlegen.

Wenn Sie persistente Verbindungen verwenden Vorsicht: PHP Handhabung von pg_pconnect ist ein wenig ... Buggy.

+0

Würde es Ihnen etwas ausmachen einen Link zu einem GitHub oder Gist zu veröffentlichen, der diese Funktionalität zeigt? oder eine Referenz? wäre sehr nützlich, danke im voraus :) – pfrank