我尝试使用外表来链接2个postgresql数据库
一切都很好,我可以检索我想要的所有数据
唯一的问题是数据包装器似乎锁定了外部服务器中的表,当我单元测试我的代码时它非常烦人
如果我不做任何选择请求,我可以初始化数据并截断本地服务器中的两个表和远程服务器中的表 但我执行一个select语句,远程服务器上的truncate命令似乎处于死锁状态
你知道我怎么能避免这种锁吗?
感谢
[编辑]
我使用此数据包装器链接2个postgresql数据库:http://interdbconnect.sourceforge.net/pgsql_fdw/pgsql_fdw-en.html
我在db2
中使用db1的table1作为外表当我在db2中的foreign_table1中执行select查询时,db1中的table1有一个AccessShareLock 查询非常简单:select * from foreign_table1
永远不会释放锁,所以当我在单元测试结束时执行truncate命令时,会发生冲突,因为truncate添加了一个AccessExclusiveLock
我不知道如何发布第一个AccessShareLock,但我认为它将由包装器自动完成...
希望这个帮助
答案 0 :(得分:1)
通常不会显式获取AccessExclusiveLock和AccessShareLock。它们是通过某些正常陈述自动获得的。请参阅locking - 锁定列表说明哪些语句获取哪些锁定,其中包含:
访问分享
仅与ACCESS EXCLUSIVE锁定模式冲突。
SELECT命令在引用的表上获取此模式的锁定。 通常,任何只读取表而不修改它的查询 将获得此锁定模式。
这意味着您的第一个事务尚未提交或回滚(因此释放其锁定),因此第二个事务不能TRUNCATE
该表,因为TRUNCATE
需要ACCESS EXCLUSIVE
}与ACCESS SHARE
冲突。
确保第一个事务提交或回滚。
BTW,“外来”数据库实际上是本地数据库,即你是否使用pgsql_fdw作为dblink的替代来模拟自治事务?