之間我已經具有以下字段的表:中強制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