Нет, я бы сделал это по-другому.
Проблема заключается в том, что вам нужно продолжать опрашивать блокировку, что означает излишнюю трату процессорного времени или больше времени ожидания, чем необходимо.
Это требование идеально подходит для консультативных блокировок PostgreSQL :
Вместо имени блокировки, например Singleton
, вы выбираете номер блокировки, например, 1234.
Чтобы получить блокировку, запустите
SELECT pg_advisory_lock(1234);
Чтобы снять блокировку, запустите
SELECT pg_advisory_unlock(1234);
Это работает так же, как обычные блокировки базы данных, путем приостановки вызывающего процесса, если блокировка недоступна, и возобновления его, как только держатель блокировки снимает блокировку. Также есть функции для & ldquo; опроса & rdquo; консультативная блокировка доступности без блокировки.
Эти блокировки не зависят от транзакций PostgreSQL, они удерживаются до тех пор, пока не будут освобождены или пока не завершится сеанс работы с базой данных (поэтому опасности «сиротской блокировки» не существует).
Эти блокировки также не мешают работе в режиме автоочистки.
Это идеальный инструмент, если приложение хочет синхронизироваться с использованием методов базы данных.