Postgresql

強制記錄的最大關係數

  • October 30, 2020

我試圖找出在高度並發系統中強制執行最大數量關係的方法。以下是一個範例案例。

// 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

引用自:https://dba.stackexchange.com/questions/278922