【问题标题】:FDW seems to lock table on foreign serverFDW 似乎锁定了外部服务器上的表
【发布时间】:2012-10-08 17:32:31
【问题描述】:

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

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

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

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

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

谢谢

[编辑]

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

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

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

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

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

希望有帮助

【问题讨论】:

  • 真的需要提供更多细节。特别是国外服务器是什么?您使用的是什么外国数据包装器?如果它不是来自股票 PostgreSQL 发行版,你从哪里得到它?您正在使用什么查询(请提供代码)?如果远程服务器支持查询日志记录,那么当您使用 fdw 时,远程服务器上会记录哪些查询?

标签: postgresql postgresql-9.1


【解决方案1】:

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

访问分享

仅与 ACCESS EXCLUSIVE 锁定模式冲突。

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

这意味着您的第一个事务尚未提交或回滚(从而释放其锁),因此第二个事务不能 TRUNCATE 表,因为 TRUNCATE 需要 ACCESS EXCLUSIVE 与 @987654325 冲突@。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2018-12-10
    • 1970-01-01
    • 2017-08-08
    • 1970-01-01
    • 1970-01-01
    • 2012-01-13
    相关资源
    最近更新 更多