gpt4 book ai didi

SELECT ... FOR UPDATE 的 PostgreSQL 间隙锁

转载 作者:行者123 更新时间:2023-12-04 13:34:48 33 4
gpt4 key购买 nike

有一个带有 Gap Lock 的查询在 MySQL/InnoDB 中使用:

SELECT id, time, count
FROM table_a
WHERE time
BETWEEN DATE_SUB(NOW(), INTERVAL 24 HOUR)
AND NOW()
FOR UPDATE
它锁定了 time范围并返回最近的记录(如果存在)(在过去 24 小时内)。
如果不是 - session 在过去 24 小时内仍然拥有锁以安全插入新记录。
是否可以在 PostgreSQL 中在整个 24 小时内(即使没有记录)进行相同的间隙锁定?

最佳答案

在 PostgreSQL 中这样做的方法是使用 SERIALIZABLE所有事务的隔离级别。
那么你就不需要 FOR UPDATE根本。 PostgreSQL 不会阻止行被插入到间隙中,但是如果两个事务同时在同一个间隙中读取和写入值,其中一个会得到序列化错误并且必须重做事务(在第二次尝试时,它会发现间隙不是空的)。
这里的概念是可串行化:如果其他人在没有阅读的情况下插入间隙是可以接受的(该事务在逻辑上在您的 SELECT 之后)。但是如果两个事务都发现间隙为空,然后插入一些东西,这将产生一个异常,由 SERIALIZABLE 阻止。 .

关于SELECT ... FOR UPDATE 的 PostgreSQL 间隙锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62861964/

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