是什么决定了多表查询的锁定顺序?

Gil*_*ili 12 sql deadlock

SQL标准是否指定了多表查询的锁定顺序?

例如,给定:

SELECT department.id FROM permissions, terminals, departments WHERE department.id = ? AND terminal.id = ? AND permissions.parent = department.id AND permissions.child = terminals.id;

  1. SQL标准是保证锁定顺序还是由(特定于实现的)执行计划确定?
  2. 有没有办法保证锁定顺序?
  3. 如果无法保证锁定顺序,我们应该如何防止死锁?

更新:如果不解释您的推理,请不要投票支持关闭此问题.就我而言,这是一个编程问题,这使得它成为Stackoverflow的主题.如果您认为问题需要进一步完善,请解释一下,我将非常乐意回答您.

Gil*_*ili 5

根据/sf/answers/7857951/,锁定顺序由特定于实现的执行顺序决定.答案进一步说,没有确定的方法来防止死锁.在命令式编程中,我们可以通过以相同顺序获取锁来防止死锁,似乎在声明性系统中,我们必须通过在检测到死锁时重试操作来解决它们.

此外,我认为,由于数据库执行计划在其生命周期内发生变化,因此在技术上不可能防止死锁.

  • 你是什​​么意思天真的数据库实现?一个可以为查询获取独占锁的数据库?我不知道这样做的任何数据库.但是,如果您必须处理这样一个"天真"的数据库,那么主要的问题是数据完整性和性能,而不是死锁. (2认同)