Postgresql 中文操作指南

34.7. Canceling Queries in Progress #

客户端应用程序可使用本节所述的函数请求取消服务器仍在处理的命令。

  • PQgetCancel #

    • 创建一个数据结构,其中包含通过特定数据库连接发出要取消的命令所需的信息。

PGcancel *PQgetCancel(PGconn *conn);
  • PQgetCancel 创建一个 PGcancel 对象,通过 PGconn 传递一个连接对象。如果给定的 connNULL 或一个无效连接,它将返回 NULLPGcancel 对象是一个不透明的结构,应用程序不应直接访问它;它只能传递给 PQcancelPQfreeCancel

    • PQfreeCancel #

  • 释放一个由 PQgetCancel 创建的数据结构。

void PQfreeCancel(PGcancel *cancel);
  • PQfreeCancel 清空先前由 PQgetCancel 创建的数据对象。

    • PQcancel #

  • 请求服务器放弃对当前命令的处理。

int PQcancel(PGcancel *cancel, char *errbuf, int errbufsize);
  • 如果取消请求已成功分发,则返回值为 1,否则为 0。如果没有,则 errbuf 将填写一个说明性错误消息。errbuf 必须是大小为 errbufsize 的字符数组(建议大小为 256 个字节)。

  • 尽管如此,发送成功不保证请求有任何效果。如果取消有效,当前命令会提前终止并返回一个错误结果。如果取消失败(比如,因为服务器已经完成处理该命令),那么将不会有任何可见结果。

  • 如果 errbuf 是信号处理程序中的本地变量,则可以安全地从信号处理程序中调用 PQcancel 。就 PQcancel 而言, PGcancel 对象是只读的,因此也可以从与操作 PGconn 对象不同的线程调用它。

    • PQrequestCancel #

  • PQrequestCancelPQcancel 的弃用形式。

int PQrequestCancel(PGconn *conn);
  • 请求服务器停止处理当前命令。它直接操作 PGconn 对象,并在出现故障时将错误消息存储在 PGconn 对象中(可以由 PQerrorMessage 检索)。尽管功能相同,此方法在多线程程序或信号处理程序中并不安全,因为覆盖 PGconn 的错误消息可能会破坏连接中正在执行的操作。