diff --git a/NEWS b/NEWS
index 47bf820d6b64c..79acaacaf1c5a 100644
--- a/NEWS
+++ b/NEWS
@@ -113,6 +113,7 @@ PHP                                                                        NEWS
   . Implement GH-15387 Pdo\Pgsql::setAttribute(PDO::ATTR_PREFETCH, 0) or
     Pdo\Pgsql::prepare(…, [ PDO::ATTR_PREFETCH => 0 ]) make fetch() lazy
     instead of storing the whole result set in memory (Guillaume Outters)
+  . Removed unused constants Pdo\Pgsql::TRANSACTION_*.
 
 - PDO_SQLITE:
   . throw on null bytes / resolve GH-13952 (divinity76).
diff --git a/UPGRADING b/UPGRADING
index 6b6c555adcf73..195eca3211538 100644
--- a/UPGRADING
+++ b/UPGRADING
@@ -96,6 +96,9 @@ PHP 8.5 UPGRADE NOTES
   . A ValueError is now thrown when trying to set a cursor name that is too
     long on a PDOStatement resulting from the Firebird driver.
 
+- PDO_PGSQL:
+  . Removed unused constants Pdo\Pgsql::TRANSACTION_*.
+
 - SimpleXML:
   - Passing an XPath expression that returns something other than a node set
     to SimpleXMLElement::xpath() will now emit a warning and return false,
diff --git a/ext/pdo_pgsql/pdo_pgsql.c b/ext/pdo_pgsql/pdo_pgsql.c
index 49efa0b238484..af9dcd0ec4102 100644
--- a/ext/pdo_pgsql/pdo_pgsql.c
+++ b/ext/pdo_pgsql/pdo_pgsql.c
@@ -179,11 +179,6 @@ PHP_METHOD(Pdo_Pgsql, setNoticeCallback)
 PHP_MINIT_FUNCTION(pdo_pgsql)
 {
 	REGISTER_PDO_CLASS_CONST_LONG("PGSQL_ATTR_DISABLE_PREPARES", PDO_PGSQL_ATTR_DISABLE_PREPARES);
-	REGISTER_PDO_CLASS_CONST_LONG("PGSQL_TRANSACTION_IDLE", (zend_long)PGSQL_TRANSACTION_IDLE);
-	REGISTER_PDO_CLASS_CONST_LONG("PGSQL_TRANSACTION_ACTIVE", (zend_long)PGSQL_TRANSACTION_ACTIVE);
-	REGISTER_PDO_CLASS_CONST_LONG("PGSQL_TRANSACTION_INTRANS", (zend_long)PGSQL_TRANSACTION_INTRANS);
-	REGISTER_PDO_CLASS_CONST_LONG("PGSQL_TRANSACTION_INERROR", (zend_long)PGSQL_TRANSACTION_INERROR);
-	REGISTER_PDO_CLASS_CONST_LONG("PGSQL_TRANSACTION_UNKNOWN", (zend_long)PGSQL_TRANSACTION_UNKNOWN);
 
 	PdoPgsql_ce = register_class_Pdo_Pgsql(pdo_dbh_ce);
 	PdoPgsql_ce->create_object = pdo_dbh_new;
diff --git a/ext/pdo_pgsql/pdo_pgsql.stub.php b/ext/pdo_pgsql/pdo_pgsql.stub.php
index 8e96a55266824..93415369c625d 100644
--- a/ext/pdo_pgsql/pdo_pgsql.stub.php
+++ b/ext/pdo_pgsql/pdo_pgsql.stub.php
@@ -18,21 +18,6 @@ class Pgsql extends \PDO
     public const int ATTR_RESULT_MEMORY_SIZE = UNKNOWN;
 #endif
 
-    /** @cvalue PGSQL_TRANSACTION_IDLE */
-    public const int TRANSACTION_IDLE = UNKNOWN;
-
-    /** @cvalue PGSQL_TRANSACTION_ACTIVE */
-    public const int TRANSACTION_ACTIVE = UNKNOWN;
-
-    /** @cvalue PGSQL_TRANSACTION_INTRANS */
-    public const int TRANSACTION_INTRANS = UNKNOWN;
-
-    /**  @cvalue PGSQL_TRANSACTION_INERROR */
-    public const int TRANSACTION_INERROR = UNKNOWN;
-
-    /** @cvalue PGSQL_TRANSACTION_UNKNOWN */
-    public const int TRANSACTION_UNKNOWN = UNKNOWN;
-
     public function escapeIdentifier(string $input): string {}
 
     public function copyFromArray(string $tableName, array $rows, string $separator = "\t", string $nullAs = "\\\\N", ?string $fields = null): bool {}
diff --git a/ext/pdo_pgsql/pdo_pgsql_arginfo.h b/ext/pdo_pgsql/pdo_pgsql_arginfo.h
index f7f54cb600c72..8efdfe53a0d16 100644
--- a/ext/pdo_pgsql/pdo_pgsql_arginfo.h
+++ b/ext/pdo_pgsql/pdo_pgsql_arginfo.h
@@ -1,5 +1,5 @@
 /* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 225cbb077d441f93b7c6bdb9826ab3e8f634b79d */
+ * Stub hash: 81399a3d342a9327733f86f6ab733bb317a4599e */
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Pdo_Pgsql_escapeIdentifier, 0, 1, IS_STRING, 0)
 	ZEND_ARG_TYPE_INFO(0, input, IS_STRING, 0)
@@ -102,35 +102,5 @@ static zend_class_entry *register_class_Pdo_Pgsql(zend_class_entry *class_entry_
 	zend_string_release(const_ATTR_RESULT_MEMORY_SIZE_name);
 #endif
 
-	zval const_TRANSACTION_IDLE_value;
-	ZVAL_LONG(&const_TRANSACTION_IDLE_value, PGSQL_TRANSACTION_IDLE);
-	zend_string *const_TRANSACTION_IDLE_name = zend_string_init_interned("TRANSACTION_IDLE", sizeof("TRANSACTION_IDLE") - 1, 1);
-	zend_declare_typed_class_constant(class_entry, const_TRANSACTION_IDLE_name, &const_TRANSACTION_IDLE_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
-	zend_string_release(const_TRANSACTION_IDLE_name);
-
-	zval const_TRANSACTION_ACTIVE_value;
-	ZVAL_LONG(&const_TRANSACTION_ACTIVE_value, PGSQL_TRANSACTION_ACTIVE);
-	zend_string *const_TRANSACTION_ACTIVE_name = zend_string_init_interned("TRANSACTION_ACTIVE", sizeof("TRANSACTION_ACTIVE") - 1, 1);
-	zend_declare_typed_class_constant(class_entry, const_TRANSACTION_ACTIVE_name, &const_TRANSACTION_ACTIVE_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
-	zend_string_release(const_TRANSACTION_ACTIVE_name);
-
-	zval const_TRANSACTION_INTRANS_value;
-	ZVAL_LONG(&const_TRANSACTION_INTRANS_value, PGSQL_TRANSACTION_INTRANS);
-	zend_string *const_TRANSACTION_INTRANS_name = zend_string_init_interned("TRANSACTION_INTRANS", sizeof("TRANSACTION_INTRANS") - 1, 1);
-	zend_declare_typed_class_constant(class_entry, const_TRANSACTION_INTRANS_name, &const_TRANSACTION_INTRANS_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
-	zend_string_release(const_TRANSACTION_INTRANS_name);
-
-	zval const_TRANSACTION_INERROR_value;
-	ZVAL_LONG(&const_TRANSACTION_INERROR_value, PGSQL_TRANSACTION_INERROR);
-	zend_string *const_TRANSACTION_INERROR_name = zend_string_init_interned("TRANSACTION_INERROR", sizeof("TRANSACTION_INERROR") - 1, 1);
-	zend_declare_typed_class_constant(class_entry, const_TRANSACTION_INERROR_name, &const_TRANSACTION_INERROR_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
-	zend_string_release(const_TRANSACTION_INERROR_name);
-
-	zval const_TRANSACTION_UNKNOWN_value;
-	ZVAL_LONG(&const_TRANSACTION_UNKNOWN_value, PGSQL_TRANSACTION_UNKNOWN);
-	zend_string *const_TRANSACTION_UNKNOWN_name = zend_string_init_interned("TRANSACTION_UNKNOWN", sizeof("TRANSACTION_UNKNOWN") - 1, 1);
-	zend_declare_typed_class_constant(class_entry, const_TRANSACTION_UNKNOWN_name, &const_TRANSACTION_UNKNOWN_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
-	zend_string_release(const_TRANSACTION_UNKNOWN_name);
-
 	return class_entry;
 }
diff --git a/ext/pdo_pgsql/php_pdo_pgsql_int.h b/ext/pdo_pgsql/php_pdo_pgsql_int.h
index 881b4e7046504..cb07a10de16f0 100644
--- a/ext/pdo_pgsql/php_pdo_pgsql_int.h
+++ b/ext/pdo_pgsql/php_pdo_pgsql_int.h
@@ -104,14 +104,6 @@ struct pdo_pgsql_lob_self {
 	Oid oid;
 };
 
-enum pdo_pgsql_specific_constants {
-	PGSQL_TRANSACTION_IDLE = PQTRANS_IDLE,
-	PGSQL_TRANSACTION_ACTIVE = PQTRANS_ACTIVE,
-	PGSQL_TRANSACTION_INTRANS = PQTRANS_INTRANS,
-	PGSQL_TRANSACTION_INERROR = PQTRANS_INERROR,
-	PGSQL_TRANSACTION_UNKNOWN = PQTRANS_UNKNOWN
-};
-
 php_stream *pdo_pgsql_create_lob_stream(zend_object *pdh, int lfd, Oid oid);
 extern const php_stream_ops pdo_pgsql_lob_stream_ops;