2013-11-20 37 views
2

大家都知道,如果一個過程進行是否有處理SQL IN列表的已定義順序?

SELECT id FROM dead WHERE id = 'A' FOR UPDATE; 
    SELECT id FROM dead WHERE id = 'B' FOR UPDATE; 

,另一個去

SELECT id FROM dead WHERE id = 'B' FOR UPDATE; 
SELECT id FROM dead WHERE id = 'A' FOR UPDATE; 

,那你就有僵局。 我寧願認爲

SELECT id FROM dead WHERE id IN ('A', 'B') FOR UPDATE; 

就會死鎖對

SELECT id FROM dead WHERE id IN ('B', 'A') FOR UPDATE; 

但鎖定定義的IN列表的順序 - 其中那些會死鎖對我的單選過程?

更確切地說,如果我有字母順序的鎖定順序約定,那麼我可以安全地將鎖A和鎖B合併到一個SQL語句中(考慮到緩慢的網絡可能會減少網絡訪問數據庫的次數)。

+3

您正在使用哪些DBMS?甲骨文? Postgres的? –

+0

如果有定義的訂單,它*將*是針對特定產品的,而且它不是SQL標準中的*,所以我們肯定需要知道您正在使用哪種產品。 –

+0

我希望我的代碼能夠在多個數據庫上工作,所以我認爲您告訴它不在標準中,因此我無法在此上下文中使用IN列表。如果你能告訴我Oracle承諾支持一個訂單而不改變它,那麼我會考慮特定數據庫的特殊情況代碼。 – user3012850

回答

0

實驗表明Oracle通過rowid對IN列表進行排序,這意味着我不能指望按我的死鎖排序慣例處理IN列表。

所以我的問題的答案是,選擇... IN(..)FOR UPDATE;是一個僵局風險。

相關問題