我有一个PostgreSQL表,其字段是一个自动时间戳字段(memcpy
)。该字段精确到微秒。是否可以使用相同时间戳的行或PostgreSQL的并发控制是否对对象更新强加了串行排序?
答案 0 :(得分:2)
是。即使您使用clock_timestamp()
,每次都会获得一个新的时间戳,即使您使用的是具有微秒计时器精度的系统,也可能发生冲突。
微秒计时器精度并不意味着微秒计时器精度或分辨率。时钟以“跳跃”进行。在某些系统上,这些跳跃是亚微秒(μs),对于像PostgreSQL这样的微秒定时器分辨率工作的应用程序是不可见的。但在某些系统上,它们可能是几十或几百毫秒(ms)!
在Windows Windows和Server 2012中引入GetSystemTimePreciseAsFileTime
之前的MS Windows(以及PostgreSQL 9.5的采用)时间限制为1毫秒(ms),分辨率通常为15毫秒!因此,非常可能会在系统上获得相同的时间值,除了大部分空闲之外的任何系统。
在现代Linux或具有最新PostgreSQL的现代Windows上,由于亚毫秒计时器分辨率,碰撞的可能性要小得多。但他们肯定还有可能。如果您选择使用时间戳作为唯一键,则应用必须能够在遇到唯一违规时重试。
答案 1 :(得分:1)
有可能。
查看一个包含大约5000万条目的PostgreSQL表,我看到大约70组条目在自动时间戳字段中具有相同的时间戳。