2024 日本 PHP 研討會

PDO::inTransaction

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

PDO::inTransaction 檢查是否在交易中

說明

public PDO::inTransaction(): bool

檢查驅動程式中目前是否有作用中的交易。此方法僅適用於支援交易的資料庫驅動程式。

參數

此函式沒有參數。

回傳值

如果目前有作用中的交易,則返回 true,否則返回 false

新增筆記

使用者貢獻的筆記 4 則筆記

jlh
4 年前
重要提示:這只會偵測是否已使用 beginTransaction() 啟動交易。它無法偵測透過任何其他方式啟動的交易,例如執行「START TRANSACTION」。
dennis
2 年前
至少對於 MySQL/MariaDB,自 8.0 版起,inTransaction 會顯示交易的實際狀態。
unger at mirea dot ru
10 個月前
關於 SQLite,此方法並不會總是返回正確的結果。這適用於包含 SQLITE_FULL、SQLITE_IOERR、SQLITE_NOMEM、SQLITE_BUSY 和 SQLITE_INTERRUPT 的錯誤。根據文件,這些錯誤可能會導致自動回滾。此方法並未將此納入考量(因為它使用 PDO 的內部追蹤機制)。
然而,SQLite 有一種方法可以判斷交易是否已自動回滾。透過使用 sqlite3_get_autocommit() C 語言函式。
匿名
4 年前
除了 jlh 所說的之外,
即使使用會自動啟動交易的 SQLite3,
inTransaction() 也只會在 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) : 在 beginTransaction() 之前
$pdo->beginTransaction();
var_dump($pdo->inTransaction());echo "<br>"; // bool(true) : 在 beginTransaction() 之後
$pdo->rollBack();
var_dump($pdo->inTransaction());echo "<br>"; // bool(false) : 在 commit() 或 rollBack() 之後

}catch (PDOException $e){

echo
'PDOException: ' . $e->getMessage();

}catch (
Exception | ErrorException $e){

var_dump($e);

}
To Top