13

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 的热门话题。如果您认为该问题需要进一步完善,请解释,我将非常乐意为您解答。

4

2 回答 2

5

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

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

于 2013-05-14T21:22:38.997 回答
1

我可以给你一个 DB2 的答案,但我认为这对于其他数据库也应该是类似的。首先,一切都取决于表的 locksize 参数。此参数定义要锁定的内容。你可以有 locksize = table、page 或 row。因此,根据每个表的锁定大小,数据库将锁定用于为游标获取数据的对象(表、页或行)。因此,创建锁的顺序将由访问路径指定,这取决于优化器。

于 2013-05-14T20:44:12.077 回答