重要说明:这将仅检测是否使用 beginTransaction() 启动了事务。它将无法检测以任何其他方式启动的事务,例如执行“START TRANSACTION”。
(PHP 5 >= 5.3.3, Bundled pdo_pgsql, PHP 7, PHP 8)
PDO::inTransaction — 检查是否在事务中
此函数没有参数。
关于 SQLite,此方法并不总是返回正确的结果。这适用于包括 SQLITE_FULL、SQLITE_IOERR、SQLITE_NOMEM、SQLITE_BUSY 和 SQLITE_INTERRUPT 在内的错误。根据文档,这些错误会导致自动回滚。该方法没有考虑到这一点(因为它使用 PDO 的内部跟踪机制)。
但是,SQLite 有一种方法可以找出事务是否被自动回滚。通过使用 sqlite3_get_autocommit() C 语言函数。
除了 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) : 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);
}