PostgreSQL差距锁定通过选择。。。更新
在MySQL/InnoDB中使用了一个查询: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小时内(即使没有记录)进行相同的间隔锁定
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
)