PHP Conference Japan 2024

pg_transaction_status

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

pg_transaction_status返回服务器当前的事务状态

描述

pg_transaction_status(PgSql\Connection $connection): int

返回服务器当前的事务状态。

警告

当使用将参数autocommit设置为关闭的 PostgreSQL 7.3 服务器时,pg_transaction_status() 将给出错误的结果。服务器端的 autocommit 功能已被弃用,并且在更高版本的服务器中不存在。

参数

connection

一个PgSql\Connection 实例。

返回值

状态可以是 PGSQL_TRANSACTION_IDLE(当前空闲)、PGSQL_TRANSACTION_ACTIVE(命令正在进行中)、PGSQL_TRANSACTION_INTRANS(空闲,在有效的交易块中)或 PGSQL_TRANSACTION_INERROR(空闲,在失败的事务块中)。如果连接不好,则报告 PGSQL_TRANSACTION_UNKNOWN。只有当查询已发送到服务器但尚未完成时,才报告 PGSQL_TRANSACTION_ACTIVE

变更日志

版本 描述
8.1.0 connection参数现在需要一个PgSql\Connection实例;以前需要一个资源

范例

示例 #1 pg_transaction_status() 示例

<?php
$dbconn
= pg_connect("dbname=publisher") or die("无法连接");
$stat = pg_transaction_status($dbconn);
if (
$stat === PGSQL_TRANSACTION_UNKNOWN) {
echo
'连接已断开';
} else if (
$stat === PGSQL_TRANSACTION_IDLE) {
echo
'连接当前空闲';
} else {
echo
'连接处于事务状态';
}
?>

添加备注

用户贡献的注释 2 条注释

r dot grellmann at agentmulder dot de
3 年前
在使用异步函数 (pg_send_query()、pg_send_query_params()…) 之一后,pg_transaction_status() 将始终报告 PGSQL_TRANSACTION_ACTIVE,无论是否已启动事务。
即使在对 pg_get_result() 的第一次调用(或所有有效调用)之后,事务状态也将保持 PGSQL_TRANSACTION_ACTIVE,直到:
- 使用了像 pq_query() 这样的同步函数,或者
- 对 pg_get_result() 的另一次调用返回 false。
注意:调用 pg_free_result() 不会改变任何内容。

<?php
$conn
= pg_connect("dbname=publisher") or die("Could not connect");
$status = pg_transaction_status($conn); // PGSQL_TRANSACTION_IDLE
pg_send_query($conn, 'SELECT 1');
$status = pg_transaction_status($conn); // PGSQL_TRANSACTION_ACTIVE
$res = pg_get_result($conn);
$status = pg_transaction_status($conn); // PGSQL_TRANSACTION_ACTIVE
$res = pg_get_result($conn); // false
$status = pg_transaction_status($conn); // PGSQL_TRANSACTION_IDLE
?>
btherl at yahoo dot com dot au
18 年前
此函数是用 C 编写的,因此无法在 SQL 中模拟它以用于旧版本的 PHP。但是,您可以通过使用一个包装器来模拟部分功能,该包装器跟踪您何时开始和提交/回滚事务。
To Top