gpt4 book ai didi

database - "select for update"什么时候加锁和解锁?

转载 作者:行者123 更新时间:2023-11-29 13:48:41 25 4
gpt4 key购买 nike

这是我的伪代码:

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

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

commit

想问下condition等于“key”的行是否已经被删除,被“select for update”阻塞的锁是否可以自动解锁,也就是说如果此时有另一个进程进入select for the同一个“ key ”不能被这把锁住?

最佳答案

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

您必须提交或回滚您的事务才能释放锁。

此外,询问“此行是否已被另一个并发事务删除”实际上没有意义。在删除行的事务提交之前,它并没有真正被删除......即使这样,它也可能已经删除并重新插入了该行,或者另一个并发事务可能已经再次插入了该行。

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

我建议您发布一个新问题,对您试图解决的潜在问题进行更详细的描述。您假设问题的解决方案是“查明该行是否已被删除”或“解锁该行”。这可能不是真正的解决方案。这有点像有人说“我在哪里买汽油”,当他们的自行车不走时,他们就认为它没油了。燃料不是问题,问题是手推自行车不消耗燃料,您必须踩踏板。

解释背景。解释你想要达到的目标。最重要的是,不要张贴伪代码,张贴您遇到问题的实际代码,最好是自包含且可运行的形式。

关于database - "select for update"什么时候加锁和解锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44403553/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com