postgresql - postgres 中的咨询锁和评估顺序(如何在不使用单独查询的情况下获取锁)

标签 postgresql locking operator-precedence

有没有什么安全的方法可以在不使用两个单独的查询的情况下在执行特定语句之前获取咨询锁?例如,我假设如果我执行以下操作,则无法保证在插入之前将获得锁:

WITH x AS (SELECT pg_advisory_lock(1,2)) INSERT ...

但是是否有一些类似的方法可以达到预期的效果?

最佳答案

我很确定 SQL 标准要求实现表现得好像他们做的第一件事就是有效地具体化 WITH 子句中的公用表表达式。 PostgreSQL complies with this requirement .

公用表表达式(主要)表现为命名对象。多个 CTE 按照声明的顺序具体化。按名称向后引用按您预期的方式工作,按名称向前引用会引发错误。

所以我很确定,在一般情况下,CTE 必须在 INSERT 语句运行之前具体化。但就您而言,使用 PostgreSQL,我不确定,这就是原因。

PostgreSQL's implementation [of common table expressions] evaluates only as many rows of a WITH query as are actually fetched by the parent query.

我不确定 INSERT 语句从这个意义上获取一行。

关于postgresql - postgres 中的咨询锁和评估顺序(如何在不使用单独查询的情况下获取锁),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10562521/

相关文章:

Java 优先级 - 转换和按位运算符

c++ - 在参数列表中使用表达式的意外输出

sql - PostgreSQL - 复杂的查询设计

ruby-on-rails - $PATH 混淆 OSX Lion 上的 Postgres 和 Rails

android - 平板电脑上的 Postgresql 服务器?

使用 get/set 的 C# 线程安全

c# - Interlocked.Increment vs lock in debug vs release mode

c# - c#中的嵌套锁定误解?

java - jooq 中具有动态名称的存储过程

c - 为什么这些构造使用前后递增的未定义行为?