2012-05-12 19 views
2

在没有使用两个单独查询的情况下执行特定语句之前,是否有任何安全方式获取咨询锁?例如,我认为,如果我这样做以下,也不能保证该锁将在插入之前获取:postgres和评估订单中的咨询锁(如何在不使用单独查询的情况下获取锁)

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

但是有没有得到预期的效果有些类似的方式?

+0

你有多确定你真的需要一个咨询锁? –

+0

那么,这不是一个真正的问题,关于使用咨询锁是否是一个好主意。我只是不确定关于评估顺序的保证。 – foldl

回答

1

我非常肯定,SQL标准要求实现的行为,就像他们所做的第一件事情是有效地实现WITH子句中的公用表表达式一样。 PostgreSQL complies with this requirement

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

所以我敢肯定,在一般的情况下,CTE将不得不在INSERT语句运行之前实现。但在你的情况下,使用PostgreSQL,我没有死定,这是为什么。

PostgreSQL's implementation [的公用表表达式] 作为实际上是 取出由父查询仅评估的尽可能多的行WITH查询。

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

+0

你引用的句子是指一个相当特殊的案例(在这个案例中它是一个简单的性能增强)。我不确定,但是听起来像计划者在某些条件满足并将其传递给CTE时采用了“LIMIT”条款。 – dezso

0

你并没有真正告诉我们足够的关于你的用例的信息,但是一般情况下,显式锁定在PostgreSQL中很有用,它们需要在事务获得其快照之前获得。咨询锁可以在您开始交易之前获得,并且大多数具有交易范围的锁应该在您开始交易之后立即获得;在任何需要交易ID的东西之前。

如果您在指定了事务ID并设置了快照之前确实不需要获取锁定,并且发出一条语句以获取锁定并执行插入对您而言很重要,请创建一个函数两者都有。

相关问题