PHP Conference Japan 2024

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,inTransaction 从 8.0 开始显示事务的真实状态
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