Ci sarebbe anche un altro problema, su PDO e sulle diverse funzionalità dei vari driver.
PostgreSQL supporta le nested transaction, transazioni annidate. MySQL no.
MySQL non solo non le supporta, ma una seconda chiamata a START TRANSACTION causa l'implicito COMMIT della precedente, e questo, se non gestito, vuol dire casini.
A livello di astrazione dei dati, io posso avere due classi,
C1, e C2, ciascuna con un metodo insert().
Entrambi i metodi usano una transazione al loro interno.
Ma il metodo C1, dentro la propria transazione, crea un istanza di C2 e invoca C2::insert(), creando, senza saperlo (le classi servono proprio a nascondere l'implementazione interna) una transazione annidata, con relativo commit implicito e troiaio inatteso.
L'aspetto va quindi gestito ad uno strato inferiore, quello del database appunto, ma PDO non mi consente di farne una gestione specifica per ogni driver.
L'unica soluzione mi sembra quella di fare l'overloading dei metodi di PDO con dentro uno switch($driver) che esegue le opportune azioni in base al driver usato... non mi sembra una soluzione molto elegante però :master:

Rispondi quotando
