Есть таблица games, в ней создаются все новые игры (insert)
| id | creator_id | ... |
Как правильно заблокировать таблицу/действие пользователя, чтобы не было условие гонки?
Потому что иногда при создании игры создается 2 одинаковые
При блокировке другие запросы на создания должно обрабатываться нормально
А есть пример реализации pg_advisory_lock()?
Как именно проверят, что ключ был заблокирован
Из-за того, что pg_advisory_lock() возвращает void я не могу проверить был ли заблокирован ключ или нет
Пытаюсь использовать pg_try_advisory_xact_lock и pg_try_advisory_lock то при каждом вызове выводит true, хотя в таблице уже есть такая блокировка
А есть пример реализации pg_advisory_lock()?
Как именно проверят, что ключ был заблокирован
ну примерно так:
-- insert_id - произвольное задаваемое вами значение (bigint)
-- вызов заблокируется, если другая сессия вызвала pg_advisory_lock с тем же insert_id
SELECT pg_advisory_lock(insert_id);
-- проверяем, есть ли уже такая игра
SELECT count(*) FROM games WHERE ...;
-- псевдокод
IF count == 0 THEN
-- вставляем
INSERT INTO GAMES VALUES (...);
END IF;
-- освобождаем блокировку
SELECT pg_advisory_unlock(insert_id);
Если все вставляющие сессии действуют по такой схеме, гонок быть не может.