之间我已经具有以下字段的表:中强制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个传入的请求使用相同的数据(不同的时间戳,但是毫秒级)打我的服务器,并且由3个不同的进程处理 - 我如何避免创建3个不同的记录(如果他们都同时检查,请参阅没有匹配的记录,每个都创建一个新的)?这是一个竞争条件的问题,我不知道如何执行它。
表锁似乎有点矫枉过正,因为这是一个写重的表,但在第三方锁机制之外还有什么替代方法?
实施例:
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'指数和处理插入错误? – 2014-09-02 11:44:00
如何在一段时间内做一个UNIQUE语句? (site_id,uuid,user_ip,user_agent)可以一起设置为唯一,但只要没有两个session_start/session_end时间戳在彼此的3小时内,就允许多行。 – 2014-09-02 11:47:43
听起来像那些时间戳是自然的关键。 – supertopi 2014-09-02 11:52:08