Le DML de mon programme php n'est pas pris en compte avec pgBouncer en mode transaction

Les utilisateurs n'aiment ni interrompre leur travail ni regarder le sablier
Répondre
Phil
Administrateur du site
Messages : 316
Enregistré le : mar. 1 sept. 2015 00:38
Localisation : France
Contact :

Le DML de mon programme php n'est pas pris en compte avec pgBouncer en mode transaction

Message par Phil »

Merci à Quentin pour sa question :

"
J'ai une configuration applicative en php 8.4, pgBouncer en 1.25 (pool_mode=transaction + max_prepared_statements=200) et libpq en 18. Quand je fais du DML (update, insert, delete), il n'est pas visible en base ensuite. Que se passe-t-il ?
"


Réponse :

Dans le log PostgreSQL avec log_statement à all, vous voyez des DEALLOCATE qui échouent au milieu d'une transaction:
begin; -- OK
update; -- OK
deallocate 'toto'; -- KO
commit; -- ROLLBACK !

PostgreSQL est, au contraire d'autres SGBDR, rigoureux sur la gestion transactionnelle. Une transaction avec une instruction KO n'est pas validée. Tout doit être 100% OK pour être validé. Dans le cas contraire, la transaction est annulée et PostgreSQL vous le dit.

Au sujet de ces deallocate parasites, le problème est corrigé en php 8.4. Vous avez une version de php en 8.4 mais probablement pour un "vieil" OS (e.g Debian 12 "Bookworm"). Votre php est compilé avec une ancienne version de libpq, cf https://github.com/php/php-src/issues/12940 donc ça n'est pas suffisant.

Avec un serveur d'appli en Debian 13 "Trixie" , tout devrait être OK nativement, même sans repo tiers.
Cdlt. Phil - pgphil.ovh
Répondre