]> granicus.if.org Git - php/commit
Fix inconsistency in PDO transaction state
authorNikita Popov <nikita.ppv@gmail.com>
Tue, 20 Oct 2020 09:29:47 +0000 (11:29 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Mon, 26 Oct 2020 16:01:18 +0000 (17:01 +0100)
commit7b9519a792a04d6943ff7082ff343a96ec00157f
tree6be4bfcec76cf2e7285deed4603f817a1e91a59a
parent6d3695a217c8a3a295fc723a8bd079db05984b70
Fix inconsistency in PDO transaction state

This addresses an issue introduced by #4996 and reported in
https://bugs.php.net/bug.php?id=80260.

Now that PDO::inTransaction() reports the real transaction state
of the connection, there may be a mismatch with PDOs internal
transaction state (in_tcx). This is compounded by the fact that
MySQL performs implicit commits for DDL queries.

This patch fixes the issue by making beginTransaction/commit/rollBack
work on the real transaction state provided by the driver as well
(or falling back to in_tcx if the driver does not support it).

This does mean that writing something like

    $pdo->beginTransaction();
    $pdo->exec('CREATE DATABASE ...');
    $pdo->rollBack(); // <- illegal

will now result in an error, because the CREATE DATABASE already
committed the transaction. I believe this behavior is both correct
and desired -- otherwise, there is no indication that the code did
not behave correctly and the rollBack() was effectively ignored.
However, this is also a BC break.

Closes GH-6355.
ext/pdo/pdo_dbh.c
ext/pdo_mysql/tests/pdo_mysql_commit.phpt
ext/pdo_mysql/tests/pdo_mysql_inTransaction.phpt
ext/pdo_mysql/tests/pdo_mysql_rollback.phpt