是否有处理SQL IN列表的已定义顺序?

时间:2013-11-20 11:39:33

标签: sql deadlock

每个人都知道,如果有一个过程

  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语句中(假设慢速网络可能会减少到数据库的网络数量,这是一件好事。) / p>

1 个答案:

答案 0 :(得分:0)

实验表明Oracle通过rowid对IN列表进行排序,这意味着我不能期望在我的死锁排序约定中处理IN列表。

所以我的问题的答案是选择... IN(..)FOR UPDATE;是一种死锁风险。