2013-11-20 34 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;是一个僵局风险。

相关问题