首页 > 解决方案 > 插入期间奇怪的 psql 行为,当表名以 0 结尾时

问题描述

我遇到插入失败。准确地说,它不会导致错误,但是当我运行以下代码时它只是冻结并且不执行任何操作:

INSERT INTO public.table_0 VALUES(CURRENT_TIMESTAMP, -999.25);

请注意我插入的表名如何以0. 但是,如果我插入到名称不以 digit 结尾的不同表中0,则插入效果很好。

INSERT INTO public.table_50 VALUES(CURRENT_TIMESTAMP, -999.25);

为什么会这样?

标签: postgresqlinsert

解决方案


很可能有什么东西在锁住public.table_0你的插入物。

您可以使用如下查询来识别阻塞锁:

SELECT locktype, relation, transactionid, pid, mode
FROM pg_locks WHERE NOT granted;

   locktype    | relation | transactionid | pid  |   mode    
---------------+----------+---------------+------+-----------
 transactionid |          |          4125 | 4434 | ShareLock
(1 row)

然后在最近的 PostgreSQL 版本中,您可以看到谁在阻止该后端:

SELECT pg_blocking_pids(4434);

 pg_blocking_pids 
------------------
 {4589}
(1 row)

您应该找到一个在事务中处于活动或空闲状态的语句:

SELECT datname, usename, application_name, xact_start, state
FROM pg_stat_activity WHERE pid = 4589;

 datname | usename | application_name |          xact_start           |        state        
---------+---------+------------------+-------------------------------+---------------------
 test    | laurenz | psql             | 2018-10-25 07:03:13.112879+02 | idle in transaction
(1 row)

推荐阅读