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 — 检查是否在事务内
检查驱动内的事务当前是否处于激活。此方法仅对支持事务的数据库驱动起作用。
此函数没有参数。
如果当前事务处于激活,则返回 true
,否则返回 false
。
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
In addition to what jlh says,
even with SQLite3 which automatically starts transaction,
inTransaction() only works after beginTransaction().
<?php
try{
$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);
}