错误:未找到交易

时间:2014-05-28 09:15:21

标签: postgresql

我刚刚在pg_log中找到了这个特定错误的一些行: ERROR: Transaction not found //some_hash

错误+周围的行:

2014-06-04 15:08:49 CEST my_user db_name LOCATION:  exec_bind_message, postgres.c:1771
2014-06-04 15:08:49 CEST my_user db_name NOTICE:  00000: Transaction expired
2014-06-04 15:08:49 CEST my_user db_name LOCATION:  exec_stmt_raise, pl_exec.c:3041
2014-06-04 15:08:49 CEST my_user db_name ERROR:  P0001: Transaction not found egcrppnddxt82frc
2014-06-04 15:08:49 CEST my_user db_name LOCATION:  exec_stmt_raise, pl_exec.c:3041

我仅在postgres source code中发现此错误。这是一些内部错误吗?什么时候可以发生?

PostgreSQL版本: 在x86_64-unknown-linux-gnu上的PostgreSQL 9.3.2, 由gcc编写(Debian 4.4.5-8)4.4.5,64位

这是我在源代码中找到的评论:

  

/ *我们检查交易的数据库ID是否存在偏执狂:if   它在另一个数据库中,然后它的xmin不会覆盖我们。呼叫者   应该已经检测到这一点,所以我们只是对待任何有趣的   案例为"未找到交易"。* /

1 个答案:

答案 0 :(得分:2)

您的错误是由用PL / PgSQL编写的用户定义代码引发的。

他们不是来自PostgreSQL。这就是除了评论之外,消息Transaction not found没有出现在PostgreSQL的源代码中的原因。你完全错误地吠叫了。

此:

2014-06-04 15:08:49 CEST my_user db_name ERROR:  P0001: Transaction not found egcrppnddxt82frc
2014-06-04 15:08:49 CEST my_user db_name LOCATION:  exec_stmt_raise, pl_exec.c:3041

所示:

  • SQLSTATEP0001,是{/ 1}}在PL / PgSQL中使用的默认代码,如果您不覆盖它;

  • RAISE ERRORexec_stmt_raise语句,RAISE内部,PL / PgSQL执行者记录;

  • pl_exec.c是来自您应用的消息

我希望看到更多上下文行显示PL / PgSQL过程名称,但也许在显式Transaction not found egcrppnddxt82frc中它们只发送到客户端,而不是服务器错误登录。我不记得了。

您可以找到罪魁祸首:

RAISE

..假设程序不是从几个单独的字符串形成错误或从其他地方获取错误。

这就是始终包含完整的,未经编辑的错误消息的原因。 如果您只是显示了整个错误行,我可以告诉您几小时前的情况