Postgresql
強制記錄的最大關係數
我試圖找出在高度並發系統中強制執行最大數量關係的方法。以下是一個範例案例。
// Job table job_id | ... | num_positions xx-xx-xx | ... | 3 // Positions table - only 1 spot left position_id | job_id | user_id aa-aa-aa | xx-xx-xx | ee-ee-ee bb-bb-bb | xx-xx-xx | ff-ff-ff
現在假設兩個人試圖同時填補最後一個位置。執行最多只能有 3 條記錄的最佳/正確方法是什麼?理想情況下,首先觸發的事務會填滿該位置。實現此類功能的最佳方法是什麼?隔離級別等?
提前致謝
想一想
// Positions table - 3 spots for `xx-xx-xx` job, only 1 spot is free position_id | job_id | user_id ------------+----------+--------- aa-aa-aa | xx-xx-xx | ee-ee-ee -- used spot bb-bb-bb | xx-xx-xx | ff-ff-ff -- used spot cc-cc-cc | xx-xx-xx | NULL -- free spot
每個作業的專色行數等於
jobs.num_positions
相應的job_id
值。當將行插入jobs
表中或jobs
更新表並amount
增加某些作業的價值時,它們會以相應的數量創建。當使用者填充現場使用者的
id
插入到user_id
列中時。當使用者釋放一個點時,它的user_id
值會更新為 NULL。所有操作僅由 UPDATE 查詢執行。現場填充查詢包括
WHERE job_id = @job AND user_id IS NULL LIMIT 1
.如果兩個並髮使用者嘗試填補一個位置,那麼較早執行此操作的使用者將填補,而稍後嘗試執行此操作的使用者將失敗,因為沒有符合條件的記錄
WHERE job_id = @job AND user_id IS NULL
。