Bug #63343 [Ana]: Commit failure for repeated persistent connection

From: Date: Thu, 10 Jun 2021 10:42:00 +0000
Subject: Bug #63343 [Ana]: Commit failure for repeated persistent connection
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-234327@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=63343&edit=1 ID: 63343 Updated by: cmb@php.net Reported by: brn at macrovita dot com dot br Summary: Commit failure for repeated persistent connection Status: Analyzed Type: Bug Package: PDO related Operating System: Mixed PHP Version: Irrelevant Block user comment: N Private report: N New Comment: Actually, Nikita's analysis[1] is spot on: | The problem as I see it is that destruction of one of the PDO | objects will always rollback the transaction on the inner object | (if a transaction is active). In this case this backfires because | in the meantime another transaction has been opened through a | different PDO object (but same inner object). It seems to me that this very issue is only an edge case of the more general issue that connections that are in use also can be reused (from the same request, but even worse also from other requests). I.e. any global state (change) of the connection (inner object) can affect other code in unforeseen ways. [1] <https://github.com/php/php-src/pull/2112#discussion_r77312340> Previous Comments: ------------------------------------------------------------------------ [2016-09-01 22:32:38] cmb@php.net This is a memory management issue, as setting $st = null hints at. Furthermore, assigning the second $db->query() to something else than $st (e.g. $st1) also lets the script succeed. The fix for PHP-7.0+ appears to be trivial (see PR #2112), but I don't know how to solve the problem for PHP-5.6. ------------------------------------------------------------------------ [2016-08-31 23:30:55] cmb@php.net Confirmed: <https://3v4l.org/iTsHt>. ------------------------------------------------------------------------ [2014-12-17 19:51:42] brn at macrovita dot com dot br Note: This bug is NOT specific to SQLite. The original test case uses SQLite just because it makes it simpler to reproduce the problem. Originally, we ran into this bug with connections against MySQL. ------------------------------------------------------------------------ [2012-10-24 00:06:25] brn at macrovita dot com dot br Description: ------------ Repeated transaction on repeated persistent PDO connection fails on commit with 'There is no active transaction'. Reproduced on: - Fedora 14 32bit PHP 5.3.6 - Gentoo 64bit PHP 5.3.14 We'll work around the bug in application code, but we thought developers might like to know about this. // BTM5282 Test script: --------------- # Should work, but does not: cat <<'EOD' | php -d display_errors=1 && echo OK <?php $db = new PDO('sqlite::memory:', '', '', array(PDO::ATTR_PERSISTENT => true)); $db->beginTransaction(); $st = $db->query('select 1'); echo $st->fetchColumn()."\n"; $db->commit(); //$st = null; $db = new PDO('sqlite::memory:', '', '', array(PDO::ATTR_PERSISTENT => true)); $db->beginTransaction(); $st = $db->query('select 2'); echo $st->fetchColumn()."\n"; $db->commit(); EOD # INTERESTING? -> Works OK with uncommented $st = null; # Works OK with PDO::ATTR_PERSISTENT => false . Expected result: ---------------- 1 2 OK Actual result: -------------- Fatal error: Uncaught exception 'PDOException' with message 'There is no active transaction' in -:11 ... ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=63343&edit=1

« previous php.bugs (#234327) next »