我刚刚在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不会覆盖我们。呼叫者 应该已经检测到这一点,所以我们只是对待任何有趣的 案例为"未找到交易"。* /
答案 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
所示:
SQLSTATE
为P0001
,是{/ 1}}在PL / PgSQL中使用的默认代码,如果您不覆盖它;
从RAISE ERROR
,exec_stmt_raise
语句,RAISE
内部,PL / PgSQL执行者记录;
pl_exec.c
是来自您应用的消息
我希望看到更多上下文行显示PL / PgSQL过程名称,但也许在显式Transaction not found egcrppnddxt82frc
中它们只发送到客户端,而不是服务器错误登录。我不记得了。
您可以找到罪魁祸首:
RAISE
..假设程序不是从几个单独的字符串形成错误或从其他地方获取错误。
这就是始终包含完整的,未经编辑的错误消息的原因。 如果您只是显示了整个错误行,我可以告诉您几小时前的情况。