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 設定為 off 的 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 實例;先前需要一個 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 則註解

0
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("無法連線");
$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
?>
0
btherl at yahoo dot com dot au
18 年前
此函式是以 C 實作的,因此沒有辦法在舊版的 PHP 中使用 SQL 模仿它。但是您可以使用一個封裝器來模仿部分功能,該封裝器會追蹤您何時開始和提交/回滾交易。
To Top