Модульное тестирование блокировок на уровне строк в PostgreSQL - PullRequest
2 голосов
/ 14 января 2012

В настоящее время я добавляю модульные тесты к довольно большому количеству хранимых процедур PostgreSQL, используя pgTap.

Некоторые процедуры выполняют операции, которые явно блокируют строки. Эти блокировки важны для приложения.

Как мне написать тесты, которые проверяют, что строки, которые должны быть заблокированы, были, а строки, которые не должны быть заблокированы, нет?

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

(примечание: использование PostgreSQL 9.1)

Ответы [ 2 ]

1 голос
/ 14 января 2012

Если вы можете определить ctid рассматриваемых строк и знать, какая транзакция должна блокировать строки, может быть, вы могли бы использовать расширение pageinspect и посмотреть флаги информации кортежа и xmax?Информационные флаги должны указывать на то, что строка заблокирована, и для xmax должен быть установлен идентификатор транзакции, в котором она находится.

0 голосов
/ 14 января 2012

Как мне написать тесты, которые проверяют, что строки, которые должны быть заблокированы, были, а строки, которые не должны быть заблокированы, нет?

Откройте отдельный переход, попробуйте заблокировать ту же строку с помощью NOWAIT и поймайте исключение.

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

PS. Я нашел эту ссылку, где Роберт Хаас объясняет, почему кортежи на уровне строк не отслеживаются в pg_locks :

(...) незапертые замки кортежей обнаруживаются в pg_locks, но они исчезают, как только предоставлены. (PostgreSQL закончится блокировки табличного пространства даже для запроса SELECT FOR UPDATE среднего размера, если мы этого не делали.)

С другой стороны - я совершенно не понимаю, почему вы хотите проверить наличие блокировки - это гарантировано после успешной команды LOCK.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...