CascadiaPHP 2024

PDO::inTransaction

(PHP 5 >= 5.3.3, Bundled pdo_pgsql, PHP 7, PHP 8)

PDO::inTransaction トランザクション内かどうかを調べる

説明

public PDO::inTransaction(): bool

ドライバ内で、現在トランザクションがアクティブになっているかどうかを調べます。 このメソッドが機能するのは、トランザクションをサポートしているデータベースドライバのみです。

パラメータ

この関数にはパラメータはありません。

戻り値

トランザクションが現在アクティブな場合に true、 そうでないときに false を返します。

add a note

User Contributed Notes 4 notes

up
6
jlh
4 years ago
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".
up
1
dennis
1 year ago
At least for MySQL/MariaDB, inTransaction shows the real state of the transaction since 8.0
up
0
unger at mirea dot ru
6 months ago
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.
up
0
Anonymous
3 years ago
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);

}
To Top