Ik ben vandaag samen met m'n collega even aan't stoeien geweest om bepaalde acties die op een database (mysql 5.0/innodb) uitgevoerd worden in een transactie te wrappen om deze zo ook weer ongedaan te kunnen maken.
Op zich helemaal geen probleem, maar het probleem is dat deze transactie over meerdere requests uitgespreid moet kunnen worden.
Een simpel idee leek me om dan mysql_pconnect te gebuiken zodat je db connectie opengehouden wordt tussen requests en je weer lekker verder kan met je transactie. Helaas, er blijkt een connection pool opgezet te worden en het blijkt te kunnen zijn dat je een connectie toegespeeld krijgt waar heel jouw transactie niet geldig is (of nog erger, de transactie van een andere user)
Op PHP.net en andere sites zeggen eigenlijk hetzelfde: een transactie kan niet over meerdere requests uitgespreid worden.
Zijn er mensen die andere oplossingen uitgevonden hebben, of geniale ideeën over een mogelijke oplossing?
Een van de ideeën waar ik zelf momenteel mee in m'n hoofd zit is het volgende:
• een transactie class die rechtstreeks in m'n dbConnection object vastgeknoopt zit
• zodra je dbConnection->startTransaction() aanroept worden alle komende (insert/update/delete) queries gelogged naar de sessie
• aan het eind van de sessie worden alle transacties automagisch ge-RollBack't.
• elke volgende request wordt automagisch gekeken of de sessie weer opnieuw ge-init moet worden en worden alle insert/update/delete queries weer uitgevoerd, zodat de transactie weer 'overnieuw afgespeeld' is.
• pas op het moment dat je expliciet commit wordt je transactie afgesloten en de queries uit de sessie weer leeggemaakt.
Iemand nog andere tips/tricks?
Op zich helemaal geen probleem, maar het probleem is dat deze transactie over meerdere requests uitgespreid moet kunnen worden.
Een simpel idee leek me om dan mysql_pconnect te gebuiken zodat je db connectie opengehouden wordt tussen requests en je weer lekker verder kan met je transactie. Helaas, er blijkt een connection pool opgezet te worden en het blijkt te kunnen zijn dat je een connectie toegespeeld krijgt waar heel jouw transactie niet geldig is (of nog erger, de transactie van een andere user)
Op PHP.net en andere sites zeggen eigenlijk hetzelfde: een transactie kan niet over meerdere requests uitgespreid worden.
Zijn er mensen die andere oplossingen uitgevonden hebben, of geniale ideeën over een mogelijke oplossing?
Een van de ideeën waar ik zelf momenteel mee in m'n hoofd zit is het volgende:
• een transactie class die rechtstreeks in m'n dbConnection object vastgeknoopt zit
• zodra je dbConnection->startTransaction() aanroept worden alle komende (insert/update/delete) queries gelogged naar de sessie
• aan het eind van de sessie worden alle transacties automagisch ge-RollBack't.
• elke volgende request wordt automagisch gekeken of de sessie weer opnieuw ge-init moet worden en worden alle insert/update/delete queries weer uitgevoerd, zodat de transactie weer 'overnieuw afgespeeld' is.
• pas op het moment dat je expliciet commit wordt je transactie afgesloten en de queries uit de sessie weer leeggemaakt.
Iemand nog andere tips/tricks?