我有一個包含這 3 列的表格:
- 任務(字串)
- 狀態(字串)
- 日期(日期時間)
我想撰寫一個執行以下操作的查詢:
- 選擇
WHERE status != "In-Progress"按日期排序的第一行(最舊的在前),并鎖定它 - 以便同時運行此查詢的其他計算機無法讀取它。 - 更新狀態列
status = "In-Progress"。 - 回傳行的列(就像常規
Select *陳述句一樣)。
如何撰寫此查詢?
我主要擔心的是,無論正在運行多少個并發實體,該行都只能由 1 臺計算機獲取。
uj5u.com熱心網友回復:
假設一個名為“tbl”的表和一個名為“tbl_id”的PK:
UPDATE tbl
SET status = 'In-Progress'
WHERE tbl_id = (
SELECT tbl_id
FROM tbl
WHERE status <> 'In-Progress'
ORDER BY date
LIMIT 1
FOR UPDATE SKIP LOCKED
)
RETURNING *;
有關每一步的深入討論,請參閱 dba.SE 上的相關答案:
- Postgres 更新...限制 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/387406.html
標籤:sql PostgreSQL的 并发 sql更新 队列
