2010-12-10 4 views
2

Il y a longtemps, j'ai écrit une classe php qui gère les connexions db postgresql.
J'ai ajouté des transactions à mes fonctions d'insertion/mise à jour et cela fonctionne très bien pour moi. Mais récemment, j'ai découvert la fonction "pg_prepare".
Je suis un peu confus au sujet de ce que cette fonction fait et si ce sera mieux d'y passer.Transactions PHP et PostgreSQL?

Actuellement chaque fois que je fais un insert/mettre à jour mon sql ressemble à ceci:

$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; 

J'ai structuré ma base de données avec les relations et je suis en utilisant (quand il est possible):

ON DELETE CASCADE 
ON UPDATE CASCADE 

Mais je veux être sûr à 100% que les choses sont propres dans la base de données et qu'il n'y a pas de restes si/quand il y a un échec lors de la mise à jour/suppression ou insertion.

Ce serait sympa si vous pouviez partager votre avis/expérience à propos de pg_prepare, ai-je vraiment besoin de la "préparation de transaction" et d'autres choses qui pourraient m'aider? :)

+3

Pourquoi utilisez-vous exactement «PREPARE TRANSACTION»? Avez-vous lu sa [documentation] (http://www.postgresql.org/docs/current/static/sql-prepare-transaction.html)? Surtout la partie sur "PREPARE TRANSACTION n'est pas destinée à être utilisée dans des applications ou des sessions interactives ..."? –

+0

Ouais .. Un peu raté qu'il y a quelques années quand j'ai écrit le pilote .. Merci pour l'aide :) – tftd

Répondre

3

Non, vous n'avez pas besoin de préparer la transaction (qui est destiné pour les transactions distribuées sur différents serveurs - comme Milen a déjà signalé

Je ne sais pas comment les poignées interface PHP, mais comme. que vous pouvez vous assurer que vous n'êtes pas en mode de validation automatique, les choses devraient bien se passer.

Si vous ne pouvez pas contrôler le mode de validation automatique, il suffit de mettre vos déclarations dans un BEGIN ... COMMIT bloc

+0

Merci pour votre aide!:) Pour ceux qui ont besoin de plus d'infos -> http://www.postgresql.org/docs/9.0/interactive/tutorial-transactions.html – tftd

4

Non, vous n'avez pas besoin de validation en 2 phases! ...

Pour le traitement de base de données PHP en toute sécurité, ne pas utiliser pg_query directement, envelopper plutôt dans une fonction spéciale qui effectue les opérations suivantes:

  • ouvre la connexion à la base de votre première requête
  • si vous utilisez des connexions persistantes, assurez-vous la connexion est dans un état connu
  • register_shutdown_function à une fonction qui émet un ROLLBACK
  • assurez-vous que autocommit est désactivé, ou tout simplement émettre un avant BEGIN la première requête
  • erreur de base de données
  • journal une e requêtes lentes
  • utilise uniquement pg_query_params() qui prend en charge des injections sql bien

De cette façon, si votre script tombe en panne ou que ce soit, un rollback est émis automatiquement. Vous ne pouvez vous engager qu'en vous engageant explicitement.

Si vous utilisez des connexions persistantes, méfiez-vous: la gestion de pg_pconnect par php est un peu ... buggée.

+0

cela vous dérangerait-il de poster un lien vers un github ou un gist montrant cette fonctionnalité? ou une référence? serait très utile, merci d'avance :) – pfrank