Postgres NOW():可以在过去吗?

问题描述 投票:0回答:1

假如我有一列 last_updated 始终充满了 NOW(). 从其他连接的角度来看,是否可以保证某行不会被设置为过去的值?例如,我有一个查询

SELECT * FROM my_table
WHERE last_updated < NOW()

的单行,返回一个带有 last_updated 与...相对应 10:10:10. 这是否意味着不可能再用 last_updated 与...相对应 10:10:09? 如果在某些情况下会发生,有没有办法让它不可能减轻风险?

Context: 一个HTTP端点,用来作为最新更新的投票目标。它取决于一个属性,如果一个行从查询中返回的是一个特定的 last_updated 次,那么为了确保不遗漏更新,其他的变化必须有自己的 last_updated 时候 之后 返回的所有记录中的那些记录。

实际的查询方法更像下面。如果投票结果中的最后一项有一个叫做 last_updated 时间戳 1575452913id123然后,下一次的投票就会像下面这样。

SELECT * FROM my_table
WHERE (last_updated, id) > (1575452913, 123) AND last_updated < EXTRACT(EPOCH FROM NOW())
ORDER BY (last_updated, id)
LIMIT 500

> 中的竞赛条件。如果行已经被添加了一个 last_updated之前 1575452913那么,他们将被错过。

我... 认为 我想要的,是代替 NOW()的一些函数,返回最早可能的 NOW() 所有开放交易的时间?

last_updated < EARLIEST_NOW_OF_OPEN_TRANSACTIONS()

我意识到这是一个非常相似的情况,以? https:/timerwich.composts20180129monotonically-increasing-ids-in-postgres。. 他们要保证单调增加的ID,而我要同样的,但要有时间戳。啊:我现在明白了 https:/github.comcockroachdbcockroachissues9227。 其中讨论了类似的问题,尽管是针对不同的数据库。

sql postgresql transactions race-condition
1个回答
3
投票

NOW() 返回当前事务开始的日期。那么如果另一个事务开始的时间更早。NOW() 可以返回一个较早的日期。

你可以使用 clock_timestamp().

详见 日期时间函数.

© www.soinside.com 2019 - 2024. All rights reserved.