SQL自动时间戳中是否可以进行冲突?

时间:2017-04-05 21:44:19

标签: sql postgresql

我有一个PostgreSQL表,其字段是一个自动时间戳字段(memcpy)。该字段精确到微秒。是否可以使用相同时间戳的行或PostgreSQL的并发控制是否对对象更新强加了串行排序?

2 个答案:

答案 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组条目在自动时间戳字段中具有相同的时间戳。