1

我尝试使用外部表来链接 2 个 postgresql 数据库

一切都很好,我可以检索我想要的所有数据

唯一的问题是数据包装器似乎锁定了外部服务器中的表,当我对代码进行单元测试时这很烦人

如果我不执行任何选择请求,我可以初始化数据并截断本地服务器中的表和远程服务器中的表,但是我执行一个选择语句远程服务器上的截断命令似乎处于死锁状态

你知道我怎样才能避免这个锁吗?

谢谢

[编辑]

我使用这个数据包装器来链接 2 个 postgresql 数据库:http: //interdbconnect.sourceforge.net/pgsql_fdw/pgsql_fdw-en.html

我使用 db1 的 table1 作为 db2 中的外部表

当我在 db2 中的 foreign_table1 中执行选择查询时,db1 中的 table1 有一个 AccessShareLock 查询非常简单:select * from foreign_table1

锁永远不会释放,所以当我在单元测试结束时执行截断命令时,会发生冲突,因为截断添加了 AccessExclusiveLock

我不知道如何释放第一个 AccessShareLock 但我认为它会由包装器自动完成......

希望这有帮助

4

1 回答 1

1

AccessExclusiveLock 和 AccessShareLock 通常不会显式获取。它们是通过某些正常语句自动获得的。请参阅锁定- 锁定列表说明哪些语句获取哪些锁定,其中显示:

访问共享

仅与 ACCESS EXCLUSIVE 锁定模式冲突。

SELECT 命令在引用的表上获取此模式的锁。一般来说,任何只读取表而不修改它的查询都会获取这种锁定模式。

这意味着您的第一个事务尚未提交或回滚(从而释放其锁),因此第二个事务不能TRUNCATE表,因为TRUNCATErequires ACCESS EXCLUSIVEwhich 与ACCESS SHARE.

确保第一个事务提交或回滚。

顺便说一句,“外部”数据库实际上是本地数据库,即您是否使用 pgsql_fdw 作为 dblink 的替代品来模拟自主事务?

于 2012-10-08T09:32:31.977 回答