У меня есть таблица, в которой есть следующие поля:Принудительного рыхлое ограничения в Postgres между несколькими клиентами
entry_id BIGSERIAL PRIMARY KEY,
site_id BIGINT NOT NULL,
uuid VARCHAR(256) NOT NULL,
session_start TIMESTAMP NOT NULL,
session_end TIMESTAMP NOT NULL,
user_ip VARCHAR(40) NOT NULL,
user_agent VARCHAR(256) NOT NULL,
Теперь у меня есть много входящих запросы, которые имеют кортежи данных по линиям (site_id, uuid, timestamp, user_ip, user_agent)
.
Мое правило состоит в том, что если в базе данных есть запись менее 3 часов (session_end), то входящий запрос обновляет session_end = timestamp
. Если нет, создайте новую запись (где session_start = session_end = timestamp
).
Входящие запросы обрабатываются несколькими процессами. Так сказать, 3-4 входящие запросы попали на мои серверы с теми же данными (разные временные метки, но в миллисекундах) и обрабатываются тремя различными процессами - как мне избежать создания трех разных записей (если они все проверяют одновременно, см. нет записей соответствия и каждый создать новый)? Это вопрос состояния гонки, и я не уверен, как обеспечить его соблюдение.
Столбчатый замок кажется излишним, так как это тяжелая таблица с записью, но какие альтернативы у меня есть вне механизма блокировки третьей стороны?
Пример:
Format:
(site_id, uuid, timestamp, user_ip, user_agent)
Incoming requests/data:
(1, 123, 2014-01-01T10:00:32, '123.123.123.123', 'Mozilla/Chrome')
(1, 123, 2014-01-01T10:00:33, '123.123.123.123', 'Mozilla/Chrome')
(1, 123, 2014-01-01T10:00:34, '123.123.123.123', 'Mozilla/Chrome')
Result tuple:
entry_id | site_id | uuid | session_start | session_end | user_ip | user_agent
--------------------------------------------------------------------------------------------
<auto> | 1 | 123 | 2014-01-01T10:00:32 | 2014-01-01T10:00:34 | ... | ...
насчет 'индекса UNIQUE' и обработки ошибок вставки в приложениях? –
Как бы вы сделали UNIQUE-заявление за период времени? (site_id, uuid, user_ip, user_agent) могут быть установлены уникально вместе, но допускается несколько строк, если две метки времени session_start/session_end не находятся в пределах 3 часов друг от друга. –
Похоже, эти временные метки являются естественными клавишами. – supertopi