Vous n'êtes pas identifié(e).

#1 18/05/2011 20:38:05

unisol
Membre

Transactions

Bonjour,

comment réaliser une transaction en postgresql / php ?

merci

Hors ligne

#2 18/05/2011 20:57:45

Marc Cousin
Membre

Re : Transactions

Il faut envoyer un BEGIN au début, et un COMMIT à la fin. Comme avec psql par exemple.


Marc.

Hors ligne

#3 19/05/2011 18:26:01

SQLpro
Membre

Re : Transactions

Oui, mais attention, ceci doit se faire au sein d'une seule et même session. Autrement dit, pas de déconnexion entre l'initialisation et la finalisation de la transaction.
En sus une transaction côté client (PHP) sera incommensurablement plus longue (donc plus bloquante) que si elle est effectuée côté serveur dans une fonction.
Pendant tout le temps de dialogue entre les serveur, les objets risquent d'être bloqués, provoquant des attentes pour les autres utilisateurs, voir des timeoiut, voir des verrous mortels....

Je vous invite à lire les articles que j'ai écrit à ce sujet :
http://sqlpro.developpez.com/cours/sgbdr/#L3.2
http://sqlpro.developpez.com/cours/sqlaz/techniques/
http://sqlpro.developpez.com/isolation-transaction/

A +


Frédéric Brouard, alias SQLpro,  ARCHITECTE DE DONNÉES,  Expert langage SQL
Le site sur les SGBD relationnel et langage SQL   : http://sqlpro.developpez.com/
Modélisation de données, conseil, expertise, audit, optimisation, tuning, formation
* * * * *  Enseignant CNAM PACA, ISEN Toulon,  CESI Aix en Provence  * * * * *

Hors ligne

#4 19/05/2011 23:32:44

unisol
Membre

Re : Transactions

Il parait evident que tout cela ce passe dans une seule et meme session .
par contre le reste est plus obscure : le php n'est pas coté serveur ?
dans mon esprit les sessions n'ont d'interet que dans des requetes action,
à savoir  "insert into..." et "update..." Dans ces cas il est ou l'echange avec la partie client ?

j'ai lu que postgresql, lorsque rien n'est explicitement déclaré (debut de transaction)
postgresq par défaut met en place un mecanique transactionnel.
ce mecanisme est moins performant que si la declaration est mise de maniere explicite (Begin).

pour la synthaxe : est ce bien comme ceci ?

BEGIN;

$requete1 = "insert into...
$requete2 = "insert into...

COMMIT;


merci d'avance pour cotre réponse sqlpro.

Dernière modification par unisol (19/05/2011 23:34:21)

Hors ligne

#5 19/05/2011 23:49:03

Marc Cousin
Membre

Re : Transactions

Le PHP est côté serveur. Mais pas le même serveur. Le serveur apache, pas le serveur PostgreSQL. Par ailleurs, le terme session, dans le message précédent, c'est pour une session à la base postgres, pas pour une session PHP.

La syntaxe, c'est: begin et commit sont des requêtes comme les autres, à envoyer à PostgreSQL comme d'autres ordres SQL.

Quand au ralentissement dont on parle, il est principalement du au temps de dialogue entre apache (PHP) et postgresql. Du temps réseau si les machines sont distinctes, mais même en local, ça peut aussi être mesurable (les deux processus ne travaillent pas en même temps, puisqu'ils passent du temps à s'envoyer des messages). Il y a aussi un peu de temps d'analyse syntaxique, de calcul de plan d'exécution, etc… C'est une des raisons pour lesquelles il est la plupart du temps plus intéressant de faire une grosse requête que plein de petites requêtes unitaires… avec le fait évidemment que la grosse requête permet au SGBD de mieux optimiser l'accès aux données que l'équivalent en plein de petites requêtes unitaires.

Le faire dans des fonctions, c'est donc souvent un gain de temps, puisqu'on s'affranchit d'une bonne partie du dialogue client/serveur, et du temps d'analyze/compilation de plans. Mais c'est peut être un marteau pilon pour écraser une mouche, ça dépend évidemment de votre contexte.

Un dernier point: l'article sur les niveaux d'isolations est fait avec SQL Server. Il y a pas mal de choses qui ne sont pas du tout les mêmes dans PostgreSQL, qui marche par défaut en isolation par snapshot, comme Oracle par exemple. Les fonctionnements sont très différents (même si il existe un mode snapshot sous SQL Server…).

Lisez plutôt le chapitre de la documentation de PostgreSQL : http://docs.postgresql.fr/9.0/mvcc.html , elle concerne davantage votre cas.

Dernière modification par Marc Cousin (20/05/2011 00:00:25)


Marc.

Hors ligne

Pied de page des forums