当前位置: 首页 > 面试题库 >

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

卓正业
2023-03-14
问题内容

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变得非常重要。如果您认为这个问题需要进一步完善,请解释一下,我们非常乐意为您解答。


问题答案:

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

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



 类似资料:
  • 问题内容: 在python中,我编写了此函数来告诉自己如何在python中工作: 然后我用 这是我的Python解释器打印的输出: 为什么即使我先将a2输入到函数中,for循环也还是在a2之前打印a3值? 问题答案: 是一本字典。字典是无序的- 简而言之,未指定顺序和实现细节。深入了解之下,该顺序将根据项目的哈希值,插入顺序等而发生巨大变化,因此最好不要依赖与之相关的任何内容。

  • 问题内容: 在围棋编程语言规范说: 3.未指定地图的迭代顺序。[…] 这是可以预期的,因为地图类型可以实现为哈希表,搜索树或其他某种数据结构。但是,如何在Go中实现呢? 换句话说,是什么决定了键的迭代顺序 我开始怀疑这个之后,我看到了地图键显然 也 有一定的迭代顺序。像这样的程序 在我的机器上打印以下内容: 无论 插入顺序如何。 带有映射的等效程序也以随机顺序打印键,但是这里的键顺序 取决于 插入

  • 问题内容: 这不是完整/正确的MySQL查询伪代码: http://dev.mysql.com/doc/refman/5.0/en/select.html指出:如果将FOR UPDATE与使用页面或行锁的存储引擎一起使用,则查询所检查的行将被写锁,直到当前交易结束 是这里只有被MySQL锁定返回的一条记录还是必须扫描以查找单个记录的所有记录? 问题答案: 我们为什么不尝试一下呢? 设置数据库 现在

  • 问题内容: 在设计模式手册中,具有双重检查锁定的单例模式已实现如下: 我不明白为什么要使用它。使用不会 违反使用双重检查锁定(即性能)的目的吗? 问题答案: 真正的问题是可能在完成构造之前为其分配存储空间。将看到该作业并尝试使用它。由于使用的是的部分构造版本,因此导致失败。

  • 问题内容: 我有一个由不同线程同时读取的表。 每个线程必须选择100行,在每行上执行一些任务(与数据库无关),然后它们必须从表中删除选定的行。 使用此查询选择行: 我的问题是:如何忽略(或跳过)以前使用MySQL中的select语句锁定的行? 问题答案: 我通常创建一个默认为NULL的process_id列,然后让每个线程使用唯一的标识符来执行以下操作: 这样可以确保每个线程从表中选择唯一的行集。

  • 大多数RDBMS允许获取所选行的共享独占锁。例如,PostgreSQL的语法如下: 使用FOR SHARE,我们甚至可以在READ_COMMITTED隔离级别获得共享锁,并且可以在不实际使用REPEATABLE_READ事务隔离的情况下防止不可重复的读取现象。 但是为了防止幻影读取,可序列化是唯一的方法。为什么没有显式的锁定语法来获取谓词锁呢? 据我所知,我不记得在Oracle、SQL Serve