FDW, кажется, блокирует таблицу на чужом сервере

Я пытаюсь использовать внешнюю таблицу для связи двух баз данных postgresql.

все в порядке, и я могу получить все данные, которые хочу

единственная проблема заключается в том, что оболочка данных, похоже, блокирует таблицы на внешнем сервере, и это очень раздражает, когда я тестирую свой код

если я не выполняю какой-либо запрос на выбор, я могу инициализировать данные и обрезать обе таблицы на локальном сервере и таблицы на удаленном сервере, но я выполняю один оператор выбора, команда усечения на удаленном сервере, похоже, находится в состоянии тупика.

Вы знаете, как я могу избежать этой блокировки?

Спасибо

[редактировать]

Я использую эту оболочку данных для связывания двух баз данных postgresql: http://interdbconnect.sourceforge.net/pgsql_fdw/pgsql_fdw-en.html

Я использую table1 из db1 как внешнюю таблицу в db2.

когда я выполняю запрос выбора в внешней_таблице1 в db2, для таблицы1 в db1 есть AccessShareLock, запрос очень прост: выберите * из внешней_таблицы1

блокировка никогда не снимается, поэтому, когда я выполняю команду усечения в конце моего модульного теста, возникает конфликт, потому что усечение добавляет AccessExclusiveLock

Я не знаю, как выпустить первый AccessShareLock, но я думаю, что это будет сделано автоматически оболочкой...

надеюсь, что это поможет


person futoshita    schedule 08.10.2012    source источник
comment
Вам действительно нужно предоставить более подробную информацию. В частности, что за сторонний сервер? Какую стороннюю оболочку данных вы используете? Если это не стандартный дистрибутив PostgreSQL, откуда вы его взяли? Какие запросы вы используете (код, пожалуйста)? Какие запросы регистрируются на удаленном сервере при использовании fdw, если удаленный сервер поддерживает регистрацию запросов?   -  person Craig Ringer    schedule 08.10.2012


Ответы (1)


AccessExclusiveLock и AccessShareLock обычно не получаются явно. Они получаются автоматически с помощью определенных нормальных утверждений. См. раздел locking — в списке блокировок указано, какие операторы получают какие блокировки, в котором говорится:

ПОДЕЛИТЬСЯ ДОСТУПОМ

Конфликтует только с режимом блокировки ACCESS EXCLUSIVE.

Команда SELECT устанавливает блокировку этого режима на таблицы, на которые ссылаются. В общем, любой запрос, который только читает таблицу и не изменяет ее, получит этот режим блокировки.

Это означает, что ваша 1-я транзакция еще не зафиксирована или не откатилась (таким образом, ее блокировки сняты), поэтому 2-я не может TRUNCATE таблицу, потому что TRUNCATE требует ACCESS EXCLUSIVE, что конфликтует с ACCESS SHARE.

Убедитесь, что первая транзакция фиксируется или откатывается.

Кстати, является ли «чужая» база данных локальной базой данных, т.е. вы используете pgsql_fdw в качестве альтернативы dblink для имитации автономных транзакций?

person Craig Ringer    schedule 08.10.2012