2017-07-18 80 views
0

我試圖端口延遲招聘到Haskell和我無法理解在DJ火災輪詢下一個作業的查詢WHERE子句:試圖瞭解延遲作業輪詢查詢

UPDATE "delayed_jobs" 
SET locked_at = '2017-07-18 03:33:51.729884', 
    locked_by = 'delayed_job.0 host:myhostname pid:21995' 
WHERE id IN (
    SELECT id FROM "delayed_jobs" 
    WHERE 
    (
     (
     run_at <= '2017-07-18 03:33:51.729457' 
     AND (locked_at IS NULL OR locked_at < '2017-07-17 23:33:51.729488') 
     OR locked_by = 'delayed_job.0 host:myhostname pid:21995' 
    ) 
     AND failed_at IS NULL 
) ORDER BY priority ASC, run_at ASC LIMIT 1 FOR UPDATE) RETURNING * 

結構在WHERE條款如下:

(run_at_condition AND locked_at_condition OR locked_by_condition) 
AND failed_at_condition 
  • 有沒有設置內部括號中run_at_condition AND locked_at_condition OR locked_by_condition失蹤的? AND/OR子句的優先級是什麼?
  • locked_by_condition目的是什麼好像被挑選出已被當前DJ流程鎖定的作業?!
+1

你在問關於SQL,但是你用兩個不相關的標籤而不是用SQL來標記你的問題。 –

+0

讓我知道Haskell是怎麼樣的) – Chris

+0

@ReinHenrichs感謝您指出:) –

回答

1

聲明可能沒有問題。整個陳述的上下文是通過設置其locked_at/locked_by字段來獲取最高優先級作業上的鎖

WHERE條件說是這樣的:「如果run_at比現在更快(這是因爲)AND,它要麼不鎖定或超過四小時前,它是鎖着的... 或者這就是全部重寫,如果它是我鎖定它,當然,如果它沒有失敗,那麼鎖定它。「所以,如果我正確地閱讀它,它看起來有點像它正在運行的東西已準備好運行,但有一個超時,所以事情不能永遠鎖定。

你的第二個問題,AND具有更高的優先級比OR

SELECT 'yes' WHERE false AND false OR true; -- 'yes', 1 row 
SELECT 'yes' WHERE (false AND false) OR true; -- 'yes', 1 row 
SELECT 'yes' WHERE false AND (false OR true); -- 0 rows 

前兩個語句平均同樣的事情,第三個是不同的。

第二點可能只是一個粗略的所有制系統?如果當前進程是鎖定某個東西的進程,那麼它應該能夠覆蓋該鎖定。