2

当用户中途中止请求时,我有时会取消任何支持他当时尝试的任何只读操作的只读语句(我谨慎地遵循这种模式),这些语句只保留给在高流量期间也会发生的昂贵查询,因此可能会引起争用。

在PG中,我取消如下查询:

选择pg_cancel_backend(pid);

当我这样做时,PG遵守但记录如下:错误:由于用户请求而取消语句.

我知道为什么它是兄弟姐妹pg_终止_后端将自己归类为错误;这是一次最后一击,潜在的危险尝试,武力扼杀了进程。

但我不明白为什么通常的查询取消被同样对待。毕竟我已经请求取消了,那么为什么记录的严重性级别如此之高?

0

2个答案2

重置为默认值
5

根据SQL标准,数据库引擎必须通过SQLSTATE变量传递每个完成命令的条件,SQLSTATE的值精确地指示怎样命令已完成。该标准将SQLSTATE值分类;来自每个组的代码可以并且将被客户端以不同的方式对待。

所讨论的特定条件“query_cancelded”被分配了代码57014,它属于“errors”类。适当地,当psql(psql)看到SQLSTATE 57014响应其命令,它会将此视为错误,并打印适当的消息。

postgres=#select pg_sleep(50);错误:由于用户请求而取消语句postgres=#\echo:SQLSTATE57014
1
  • 1
    仅供参考,OP的日志直接来自我们的web服务,而不是psql。我不使用psql;也许是驱动程序本身在进行与psql相同的代码到标签转换。谢谢你的详细分类,但我要指出的是,我发现了你对“从发出取消声明的流程的角度来看,这是一个错误”更有效的解释。 评论 5月22日20:22
1

您之所以会出现这种行为,是因为从启动SELECT查询的客户端程序的角度来看,它被取消了一个错误。

默认情况下,根本不清楚启动SELECT(或任何可能的命令)的用户是运行pg取消后端呼叫。它可能是不同的用户(具有相同的非特权帐户),也可能是超级用户。假设我作为一名DBA,在你不知情或不愤怒的情况下取消了你的查询;你当然希望得到一条关于这件事的尖锐错误消息,而不仅仅是在窗口的一个角落里看到0个结果之类的小提示。

从概念上讲,如果出现错误,结果会是什么报道?然后,客户机会期望得到一些结果集——一些记录,或者一个空集。这两个返回值都是错误的,它们表明存在一些结果,但实际上并没有。当然,如果它是一个实际的程序,那么客户端(而不是某些SQL工具中的用户会话)肯定希望像往常一样启动任何异常处理,以保持一致。

  • 这就是上面@mustaccio在评论中所说的;我头脑发热,忘记了从PG的角度来看,我在每一节课上都是不同的人。日志记录本身并不是我认为有问题的事情(当然,在发布这篇文章时,现在不是了)。正是严重程度让我大吃一惊。“错误”是。。“严重”级别。我希望它会被记录为通知.PG没有一流的查询取消支持,因此中止命令的任何内容被视为错误。 评论 5月23日12:40
  • 我想在这里说的是,虽然我的OP得到了那条评论(以及你的回答)的回答,但事实上,即使PG能够确定我是发出声明的同一个用户,PG仍然会认为这是一个错误。 评论 5月23日12:44
  • 确切地。mustaccios的回答也不错,只是想从不同的角度说明为什么即使您不了解SQL标准,这一切都有意义@尼古拉斯明 评论 5月23日12:56

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.