什么时候“选择更新”锁定和解锁?

时间:2013-04-01 01:53:45

标签: database postgresql locking

这是我的伪代码:

re = [select **result** from table where **condition**=key for update]

if[re satisfies]
{
    delete from table where **condition** = key;
}

commit

我想询问条件等于“key”的行是否已被删除,“select for update”阻止的锁是否可以自动解锁,这意味着如果此时另一个进程进入并选择相同的“钥匙”它不能被这个阻止?

1 个答案:

答案 0 :(得分:23)

在命令执行期间(通常在开头或接近开始时)执行锁定。当事务提交或回滚时,锁定(advisory locks除外)仅释放。没有FOR UNLOCK,也没有UNLOCK命令来反转表级LOCK命令的效果。这一切都解释为in the concurrency control section of the PostgreSQL documentation

您必须提交或回滚事务以释放锁定。

此外,询问“此行已被另一个并发事务删除”并没有任何意义。在删除行提交的事务提交之前,它并没有真正删除...即便如此,它可能已被删除并重新插入行或另一个并发事务可能会再次插入该行。

您是否正在构建任务队列或消息队列系统,因为如果是这样,该问题就解决了,您不应该尝试重新发明那个异常复杂的轮子。请参阅PGQActiveMQRabbitMQZeroMQ等。(未来PostgreSQL版本may include FOR UPDATE SKIP LOCKED正在测试中,但尚未发布写作。)

我建议您发布一个新问题,其中包含您要解决的潜在问题的更详细说明。您假设您的问题的解决方案是“找出该行是否已被删除”或“解锁该行”。这可能实际上不是解决方案。这有点像有人说“我在哪里买汽油”当他们的推车没有去,所以他们认为它没有燃料。燃料不是问题,问题是推自行车不需要燃料,你必须踩它们。

解释背景。解释你想要实现的目标。最重要的是,不要发布伪代码,发布您遇到问题的实际代码,最好是以自包含和可运行的形式发布。