我有一个 PostgreSQL 表,其中有一个字段是自动时间戳字段 (SET DEFAULT CURRENT_TIMESTAMP
)。该字段是微秒精度。是否可能有具有相同时间戳的行,或者 PostgreSQL 的并发控制是否对对象更新强加了串行排序?
最佳答案
是的。即使您使用 clock_timestamp()
每次都会获得一个新的时间戳,即使您使用的系统具有微秒计时器精度,也可能会发生冲突。
微秒计时器精度并不意味着微秒计时器准确性 或分辨率。时钟在“跳跃”中前进。在某些系统上,这些跳跃是亚微秒 (μs) 并且对于以微秒计时器分辨率工作的应用程序(如 PostgreSQL)是不可见的。但在某些系统上,它们可能是数十或数百毫秒 (ms)!
在引入 GetSystemTimePreciseAsFileTime
之前的 MS Windows 上在 Windows 8 和 Server 2012(及其被 PostgreSQL 9.5 采用)中,时间限制为 1 毫秒 (ms) 分辨率,通常为 15 毫秒分辨率!因此,极有可能在一个系统上多次调用时获得相同的时间值,该系统除了大部分处于空闲状态之外。
在现代 Linux 或带有最新 PostgreSQL 的现代 Windows 上,由于亚毫秒计时器分辨率,冲突的可能性要小得多。但它们绝对仍有可能。如果您选择使用时间戳作为唯一键,您的应用必须能够在遇到唯一违规时重试。
关于sql - SQL 自动时间戳中是否可能发生冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43242171/