PHP Conference Nagoya 2025

pg_transaction_status

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

pg_transaction_status Возвращает текущее состояние транзакции на сервере

Описание

pg_transaction_status(PgSql\Connection $connection): int

Возвращает текущее состояние транзакции на сервере.

Предостережение

pg_transaction_status() выдаёт некорректный результат при работе с сервером PostgreSQL 7.3, на котором выключена опция 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; раньше параметр ожидал ресурс (resource).

Примеры

Пример #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 notes

up
0
r dot grellmann at agentmulder dot de
3 years ago
After one of the asynchronous functions (pg_send_query(), pg_send_query_params()...) has been used, pg_transaction_status() will always report PGSQL_TRANSACTION_ACTIVE, no matter if a transaction was started or not.
Even after the first call (or all valid calls) to pg_get_result() the transaction status will stay PGSQL_TRANSACTION_ACTIVE, until either
- a synchronous function like pq_query() was used, or
- another call to pg_get_result() was made, which returns false.
Note: calling pg_free_result() does not change anything.

<?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
?>
up
0
btherl at yahoo dot com dot au
18 years ago
This function is implemented in C, so there's no way to mimic it in SQL for older versions of PHP. But you can mimic some of the functionality by using a wrapper which keeps track of when you begin and commit/rollback transactions.
To Top