每个人都知道,如果有一个过程
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>
答案 0 :(得分:0)
实验表明Oracle通过rowid对IN列表进行排序,这意味着我不能期望在我的死锁排序约定中处理IN列表。
所以我的问题的答案是选择... IN(..)FOR UPDATE;是一种死锁风险。