Stack Exchange网络由183个问答社区组成,包括堆栈溢出是开发人员学习、分享知识和建立职业生涯的最大、最受信任的在线社区。
与Stack Overflow for Teams一起提问、寻找答案并进行协作。
与Stack Overflow for Teams一起提问、寻找答案并进行协作。探索团队
团队
工作问答
在一个结构化且易于搜索的位置内连接和共享知识。
当用户中途中止请求时,我有时会取消任何支持他当时尝试的任何只读操作的只读语句(我谨慎地遵循这种模式),这些语句只保留给在高流量期间也会发生的昂贵查询,因此可能会引起争用。
在PG中,我取消如下查询:
选择pg_cancel_backend(pid);
选择pg_cancel_backend(pid)
当我这样做时,PG遵守但记录如下:错误:由于用户请求而取消语句.
错误:由于用户请求而取消语句
我知道为什么它是兄弟姐妹pg_终止_后端将自己归类为错误;这是一次最后一击,潜在的危险尝试,武力扼杀了进程。
pg_终止_后端
但我不明白为什么通常的查询取消被同样对待。毕竟我已经请求取消了,那么为什么记录的严重性级别如此之高?
根据SQL标准,数据库引擎必须通过SQLSTATE变量传递每个完成命令的条件,SQLSTATE的值精确地指示怎样命令已完成。该标准将SQLSTATE值分类;来自每个组的代码可以并且将被客户端以不同的方式对待。
所讨论的特定条件“query_cancelded”被分配了代码57014,它属于“errors”类。适当地,当psql(psql)看到SQLSTATE 57014响应其命令,它会将此视为错误,并打印适当的消息。
psql(psql)
postgres=#select pg_sleep(50);错误:由于用户请求而取消语句postgres=#\echo:SQLSTATE57014
您之所以会出现这种行为,是因为从启动SELECT查询的客户端程序的角度来看,它被取消了是一个错误。
默认情况下,根本不清楚启动SELECT(或任何可能的命令)的用户是运行pg取消后端呼叫。它可能是不同的用户(具有相同的非特权帐户),也可能是超级用户。假设我作为一名DBA,在你不知情或不愤怒的情况下取消了你的查询;你当然希望得到一条关于这件事的尖锐错误消息,而不仅仅是在窗口的一个角落里看到0个结果之类的小提示。
pg取消后端
从概念上讲,如果出现错误,结果会是什么不报道?然后,客户机会期望得到一些结果集——一些记录,或者一个空集。这两个返回值都是错误的,它们表明存在一些结果,但实际上并没有。当然,如果它是一个实际的程序,那么客户端(而不是某些SQL工具中的用户会话)肯定希望像往常一样启动任何异常处理,以保持一致。
通知
提醒:数据库管理员堆栈交换中不允许使用人工智能工具生成的答案。了解更多信息
必需,但从未显示
Required, but never shown
单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.