PostgreSQL差距锁定通过选择。。。更新

PostgreSQL差距锁定通过选择。。。更新,postgresql,locking,Postgresql,Locking,在MySQL/InnoDB中使用了一个查询: SELECT id, time, count FROM table_a WHERE time BETWEEN DATE_SUB(NOW(), INTERVAL 24 HOUR) AND NOW() FOR UPDATE 它锁定时间范围并返回最近的记录(如果存在)(在过去24小时内)。 如果没有-会话在过去24小时内仍然拥有一个锁,以安全地插入新记录 在PostgreSQL中,是否可以在整个24小时内(即使没有记录)进行相同的间隔锁定

在MySQL/InnoDB中使用了一个查询:

SELECT id, time, count
FROM table_a
WHERE time
    BETWEEN DATE_SUB(NOW(), INTERVAL 24 HOUR)
    AND NOW()
FOR UPDATE
它锁定
时间范围
并返回最近的记录(如果存在)(在过去24小时内)。 如果没有-会话在过去24小时内仍然拥有一个锁,以安全地插入新记录


在PostgreSQL中,是否可以在整个24小时内(即使没有记录)进行相同的间隔锁定?

在PostgreSQL中,实现这一点的方法是对所有事务使用可序列化的隔离级别

那么你根本不需要
来更新
。PostgreSQL不会阻止在间隙中插入行,但如果两个事务同时在同一间隙中读取和写入值,其中一个事务将出现序列化错误,必须重新执行该事务(第二次尝试时,它将发现间隙不是空的)


这里使用的概念是可序列化性:如果其他人在未读取的情况下插入间隙,则可以接受(该事务在逻辑上位于使用
选择的
的事务之后)。但是,如果两个事务都发现间隙为空,然后插入某个内容,则会创建异常,该异常可由
SERIALIZABLE

阻止。不,不能锁定不存在的行。但我看不出您的表是如何存储一个“范围”的,因为它只有一个名为
time
的列(这可能是
时间戳而不是
time