当前位置: 首页 > 知识库问答 >
问题:

为什么谓词锁不能通过显式锁定查询语法获得

郎长卿
2023-03-14

大多数RDBMS允许获取所选行的共享独占锁。例如,PostgreSQL的语法如下:

SELECT * 
FROM post 
WHERE id=10 
FOR SHARE;

使用FOR SHARE,我们甚至可以在READ_COMMITTED隔离级别获得共享锁,并且可以在不实际使用REPEATABLE_READ事务隔离的情况下防止不可重复的读取现象。

但是为了防止幻影读取,可序列化是唯一的方法。为什么没有显式的锁定语法来获取谓词锁呢?

据我所知,我不记得在Oracle、SQL Server、MySQL或PostgreSQL中看到过这样的构造。

共有2个答案

王俊楚
2023-03-14

该标准未指定谓词锁,或者必须使用谓词锁来实现 SERIALIZABLE。它仅指定可序列化必须防止的异常...大多数 DBMS 实际上并不完全符合那里。

在PostgreSQL的例子中,没有明确的谓词锁定语法,因为没有谓词锁。PostgreSQL使用更像SERIALIZABLE的乐观锁定,它跟踪事务间依赖关系,如果检测到循环依赖关系,则中止。这不符合锁的语义学,显式执行也不太有用。

虞博涛
2023-03-14

在PostreSQL中,可串行化隔离级别基于所谓的可串行化快照隔离,它使用谓词锁不是用于实际锁定,而是用于监视可能导致串行化异常的条件。此机制仅在可序列化级别工作;没有办法在较低级别使用谓词锁。

但是为了防止幻像读取,您实际上只需要PostgreSQL中的可重复读取隔离级别(不管SQL标准如何描述隔离级别)。有关详细信息,请参见文档。

至于甲骨文,它根本没有谓词锁。它的可序列化隔离级别使用快照隔离(与 PostgreSQL 中的可重复读取相同),这可以防止幻像读取,但允许其他序列化异常。

我没有关于SQL服务器和MySQL的信息。

 类似资料:
  • 为清楚起见,改写为准 我希望能够通过在适当的时候直接调用lock和release方法,将同步块的使用与更明确的锁定结合起来。因此,当我可以轻松使用sychtronized(myObject)时,我可以使用sychtornized的语法优势,但也可以调用myObject.lock 我知道每个对象都隐含地内置了一个租用锁,该锁由同步块使用。实际上,每次进入同步块时,都会在对象内部重入锁上校准锁定,并在

  • 问题内容: SQL标准是否为多表查询指定锁定顺序? 例如,给定: SQL标准是保证锁定顺序还是由(特定于实现的)执行计划确定? 有没有办法保证锁定顺序? 如果没有办法保证锁定顺序,我们应该如何防止死锁? 更新 :在未解释您的推理之前,请不要投票结束该问题。就我而言,这是一个编程问题,这使Stackoverflow变得非常重要。如果您认为这个问题需要进一步完善,请解释一下,我们非常乐意为您解答。 问

  • 我有一个非常简单的语法,如下所示: (我需要使用语义谓词,因为我需要解析关键字可以用作标识符的语言)。 参考:https://github.com/antlr/antlr4/blob/master/doc/predicates.md

  • 问题内容: 我在这里思考:如果您有2个线程执行需要同步的FAST操作,那么非阻塞方法不是比阻塞/上下文切换方法更快/更好的方法吗? 非阻塞的意思是: while(true){如果(checkAndGetTheLock())中断;} 如果您有太多线程在锁中循环,我唯一想到的就是饥饿(CPU耗尽)。 如何平衡一种方法与另一种方法? 问题答案: 以下是 Java Concurrency in Pract

  • 死锁描述了另外两个线程因为永远等待对方而被阻塞的情况。当死锁发生时,程序永远挂起,你唯一能做的就是杀死程序。 为什么在下面给出的示例生产者-消费者问题中没有发生死锁: 我想知道为什么当同步对象正在等待其他线程释放锁时,在同步块中调用等待方法不会导致死锁?

  • 环境是Java、Spring-boot、Hibernat、QueryDSL、MySQL。 我有表结构 艾碧索 更新 为了澄清起见,支持UI视图的DTO包含“casename”属性。它是在将域对象转换为DTO时在服务层创建的: