注意:我使用DBeaver 21.1.3作为PostgreSQL开发工具。
为了测试,我创建了一个表:
CREATE TABLE test_sk1(n numeric(2));
字符串
然后我在DBEaver上禁用了Auto-Commit,以验证是否可以看到其他事务的阻塞查询。
x1c 0d1x的数据
然后我在我的表上执行了一个插入:
INSERT INTO test_sk1(n) values(10);
型
现在这个插入事务是未提交的,这将阻塞表。
然后我又打开了另一个新的SQL窗口,并在表上尝试alter命令。
ALTER TABLE test_sk1 ADD COLUMN v VARCHAR(2);
型
现在我看到alter transaction被阻塞了。但是当我在锁中验证时,我看到这个Alter transaction被“Show search_path;”transaction阻塞了,在那里我期待“搜索.”transaction作为阻塞查询。
的
我使用下面的查询来获取锁:
SELECT p1.pid,
p1.query as blocked_query,
p2.pid as blocked_by_pid,
p2.query AS blocking_query
FROM pg_stat_activity p1, pg_stat_activity p2
WHERE p2.pid IN (SELECT UNNEST(pg_blocking_pids(p1.pid)))
AND cardinality(pg_blocking_pids(p1.pid)) > 0;
型
为什么我们的数据库会出现这种情况?
2条答案
按热度按时间holgip5t1#
尝试使用psql进行这样的实验。DBeaver和许多其他工具将执行许多您不打算运行的SQL语句。
您在
pg_stat_activity
中看到的查询只是该进程完成的最新查询,不一定是锁定任何资源的查询。mm5n2pyu2#
默认情况下,DBeaver的SQL编辑器会在执行每个查询后尝试更新有关当前目录/模式的信息。您可以通过取消选中Window -> Preferences -> Editors -> SQL Editor-> SQL Processing -> Refresh active schema after SQL execution来关闭此功能,并查看它是否会更改您在会话浏览器中看到的内容。