2024年9月26日: PostgreSQL 17 发布!
支持的版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:devel
不支持的版本:11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

32.20. 线程程序中的行为 #

从版本 17 开始,libpq 始终是可重入且线程安全的。但是,一个限制是,没有两个线程尝试同时操作同一个 PGconn 对象。特别是,您不能通过同一个连接对象从不同的线程发出并发命令。(如果您需要运行并发命令,请使用多个连接。)

PGresult 对象在创建后通常是只读的,因此可以在线程之间自由传递。但是,如果您使用了在第 32.12 节第 32.14 节中描述的任何 PGresult 修改函数,则您也需要避免对同一个 PGresult 进行并发操作。

在早期版本中,libpq 可以使用或不使用线程支持进行编译,具体取决于编译器选项。此函数允许查询 libpq 的线程安全状态

PQisthreadsafe #

返回 libpq 库的线程安全状态。

int PQisthreadsafe();

如果 libpq 是线程安全的,则返回 1;如果不是,则返回 0。在版本 17 及更高版本上始终返回 1。

已弃用的函数 PQrequestCancelPQoidStatus 不是线程安全的,不应在多线程程序中使用。PQrequestCancel 可以替换为 PQcancelBlockingPQoidStatus 可以替换为 PQoidValue

如果您在应用程序内部(除了在 libpq 内部)使用 Kerberos,则需要在 Kerberos 调用周围进行锁定,因为 Kerberos 函数不是线程安全的。有关在 libpq 和您的应用程序之间进行协作锁定的方法,请参阅 libpq 源代码中的函数 PQregisterThreadLock

提交更正

如果您在文档中看到任何不正确的内容,与您对特定功能的体验不符,或者需要进一步说明,请使用此表单报告文档问题。