当前位置: 首页 > Database, postgresql > 正文

postgresql 的查询取消操作

原来pg的取消查询是这么做的,果然眼前一亮啊。

在一条查询正在处理的时候,可能取消该查询的处理。 这样的取消请求不是直接通过打开的连接发送给后端的,这么做是因为实现的有效性: 我们不希望后端在处理查询的过程中不停地检查前端来的输入。 取消请求应该相对而言比较少见,所以我们把取消做得稍微笨拙一些,以便不影响正常状况的性能。

要发送一条取消请求,前端打开一个与服务器的新连接并且发送一条 CancelRequest 消息, 而不是通常在新连接中经常发送的 StartupPacket 消息。 服务器将处理这个请求然后关闭连接。 出于安全原因,对取消请求消息不做直接的响应。

除非 CancelRequest 消息包含与连接启动过程中传递给前端的相同的键数据(PID 和 安全键字), 否则它将被忽略。如果该请求匹配当前运行着的后端的 PID 和安全键字, 则退出当前查询的处理(目前的实现里采用的方法是向正在处理该查询的后端进程发送一个特殊的信号。)

取消信号可能有也可能没有做用 — 例如,如果它在后端完成查询的处理后到达, 那么它就没有做用。如果取消起作用了,其结果是当前命令带着一个错误信息提前退出。

这么做是对安全和有效性通盘考虑的结果, 前端没有直接的方法获知一个取消请求是否成功。 它必须继续等待后端对查询响应。执行取消仅仅是增加了当前查询快些结束的可能性, 以及增加了当前查询会带着一条错误信息失败而不是成功执行的可能性。

因为取消请求是通过新的联接发送给服务器而不是通过平常的前端/后端通讯链接, 所以取消请求可能是任意进程执行的,而不仅仅是要取消查询的前端。 这样可能对创建多进程应用有某种灵活性的好处。但是同时这样也带来了安全风险, 因为这样任何一个非认证用户都可能试图取消查询。 这个安全风险通过要求在取消请求中提供一个动态生成的安全键字排除。

    分享到:

本文固定链接: http://klwang.info/postgresql-query-cancel/ | 数据库|Linux|软件开发

该日志由 klwang 于2014年01月19日发表在 Database, postgresql 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: postgresql 的查询取消操作 | 数据库|Linux|软件开发
关键字: ,

postgresql 的查询取消操作:等您坐沙发呢!

发表评论

*
快捷键:Ctrl+Enter