Important note: This will only detect whether a transaction has been started using beginTransaction(). It will not be able to detect transactions started by any other means, for example by executing "START TRANSACTION".
(PHP 5 >= 5.3.3, Bundled pdo_pgsql, PHP 7, PHP 8)
PDO::inTransaction — Проверяет, начата ли транзакция
Проверяет, активна ли в данный момент транзакция в драйвере. Этот метод работает только для драйверов баз данных, которые поддерживают транзакции.
У этой функции нет параметров.
Important note: This will only detect whether a transaction has been started using beginTransaction(). It will not be able to detect transactions started by any other means, for example by executing "START TRANSACTION".
At least for MySQL/MariaDB, inTransaction shows the real state of the transaction since 8.0
With respect to SQLite, this method does not always return the correct result. This applies to errors including SQLITE_FULL, SQLITE_IOERR, SQLITE_NOMEM, SQLITE_BUSY, and SQLITE_INTERRUPT. According to the documentation, these errors can cause an automatic rollback. The method does not take this into account (because it uses PDO's internal tracking mechanism).However, SQLite has a way to find out whether the transaction was automatically rolled back or not. By using sqlite3_get_autocommit() C-language function.
In addition to what jlh says, even with SQLite3 which automatically starts transaction,inTransaction() only works after beginTransaction().<?phptry{ $pdo = new PDO('sqlite:test.sql3', null, null, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]); var_dump($pdo->inTransaction());echo "<br>"; // bool(false) : before beginTransaction() $pdo->beginTransaction(); var_dump($pdo->inTransaction());echo "<br>"; // bool(true) : after beginTransaction() $pdo->rollBack(); var_dump($pdo->inTransaction());echo "<br>"; // bool(false) : after commit() or rollBack()}catch (PDOException $e){ echo 'PDOException: ' . $e->getMessage();}catch (Exception | ErrorException $e){ var_dump($e);}