在执行特定语句之前是否有任何安全的获取咨询锁的方法而不使用两个单独的查询?例如,我假设如果我执行以下操作,则无法保证在插入之前获取锁定:
WITH x AS (SELECT pg_advisory_lock(1,2)) INSERT ...
但是有没有类似的方法来获得预期的效果?
答案 0 :(得分:1)
我很确定SQL标准要求实现的行为就好像他们做的第一件事就是有效地实现WITH子句中的公用表表达式。 PostgreSQL complies with this requirement
公用表表达式(主要)表现为命名对象。多个CTE按其声明的顺序具体化。按名称向后引用按预期工作,按名称转发引用会引发错误。
所以我很确定,在通用的情况下,CTE必须在INSERT语句运行之前实现。但在你的情况下,使用PostgreSQL,我并不确定,这就是原因。
PostgreSQL's implementation [常用表格式] 仅评估与实际查询一样多的WITH查询行 由父查询提取。
我不确定INSERT语句是否在这个意义上取了一行。
答案 1 :(得分:0)
你还没有真正告诉我们你的用例,但一般来说,在PostgreSQL中显式锁有用,需要在事务获取其快照之前获取它们。在开始交易之前可以获取咨询锁,并且应该在开始交易后立即获取具有交易范围的大多数锁;在任何需要交易ID之前。
如果在分配事务ID和设置快照之前确实不需要获取锁定,并且发出一个语句来获取锁定并执行插入对您来说很重要,请创建一个函数,做到了。