取消正在处理的查询

PostgreSQL 9.4.4 中文手册
上一页 | 上一级 | 章 31. libpq - C 库 | 下一页

# 31.6. 取消正在处理的查询

一个客户端应用可以使用本节描述的函数，要求取消一个仍在被服务器处理的命令。

`PQgetCancel`

  创建一个数据结构，这个数据结构包含通过特定数据库连接取消一个命令所需要的信息。

      PGcancel *PQgetCancel(PGconn *conn);

  给出一个`PGconn`连接对象，`PQgetCancel`创建一个 `PGcancel`对象。如果给出的`conn` 是`NULL`或者是一个无效的连接，那么它将返回`NULL`。 `PGcancel`对象是一个不透明的结构，不应该为应用所直接访问； 我们只能把它传递给`PQcancel`或者`PQfreeCancel`。

`PQfreeCancel`

  释放`PQgetCancel`创建的数据结构。

      void PQfreeCancel(PGcancel *cancel);

  `PQfreeCancel`释放一个由前面的`PQgetCancel`创建的数据对象。

`PQcancel`

  要求服务器放弃处理当前命令。

      int PQcancel(PGcancel *cancel, char *errbuf, int errbufsize);

  如果取消请求成功发送，则返回值为 1，否则为 0。如果不成功，则`errbuf` 里面会填充解释的错误消息。`errbuf`必须是一个大小为`errbufsize` 的 char 数组（建议大小为 256 字节）。

  不过，成功发送取消请求并不保证请求会有任何效果。如果取消生效， 那么当前的命令将提前结束并且返回一个错误的结果。如果取消失败（也就是说， 因为服务器已经完成命令的处理），那么就根本不会有可见的结果。

  如果`errbuf`是信号句柄里的一个局部变量，那么`PQcancel` 可以在一个信号句柄里安全地调用。在`PQcancel`涉及的范围里， `PGcancel`对象都是只读的， 因此我们也可以从一个与处理`PGconn` 对象的线程分离的线程里处理它。

`PQrequestCancel`

  `PQrequestCancel`是`PQcancel`的一个废弃的变种。

      int PQrequestCancel(PGconn *conn);

  要求服务器放弃对当前命令的处理。它直接在`PGconn`对象上进行操作， 并且如果失败，就会在`PGconn`对象里存储错误消息（因此可以用 `PQerrorMessage`检索出来。）尽管功能一样， 但是这个方法在多线程程序里和信号句柄里会有危险，因为它可能覆盖`PGconn` 的错误消息，因此将可能把当前连接正在处理的操作打乱。

上一页 | 起始页 | 下一页
逐行检索查询结果 | 上一级 | 捷径接口