SQL标准是否指定了多表查询的锁定顺序?
例如,给定:
SELECT department.id FROM permissions, terminals, departments WHERE department.id = ? AND terminal.id = ? AND permissions.parent = department.id AND permissions.child = terminals.id;
更新:如果不解释您的推理,请不要投票支持关闭此问题。就我而言,这是一个编程问题,这使得它成为Stackoverflow的主题。如果您认为问题需要进一步完善,请解释一下,我将非常乐意回答您。
答案 0 :(得分:5)
根据https://stackoverflow.com/a/112256/14731锁定顺序由特定于实现的执行顺序确定。答案进一步说,没有确定的方法来防止死锁。在命令式编程中,我们可以通过以相同的顺序获取锁来防止死锁,似乎在声明性系统中,我们必须通过在检测到死锁时重试操作来解决它们。
此外,我认为,由于数据库执行计划在其生命周期内发生变化,因此在技术上不可能防止死锁。
答案 1 :(得分:1)
我可以给你一个DB2的答案,但我认为这对于其他数据库也应该是类似的。首先,一切都取决于表的locksize参数。此参数定义要锁定的内容。您可以拥有locksize = table,page或row。因此,根据每个表的锁定大小,数据库将锁定用于获取游标数据的对象(表,页或行)。因此,创建锁的顺序将由访问路径指定,这取决于优化器。