sql - SQL 自动时间戳中是否可能发生冲突?

标签 sql postgresql

我有一个 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/

相关文章:

SQL:删除值已存在的行

.Net PostgreSQL 连接字符串

java - 如何在 sql INSERT 期间自动生成 ID?

sql - PostgreSQL distinct on + order by 查询优化

node.js - 如何使用书架js输出1对多对象

php - 使用表单更新 PHP inc 文件

mysql - 如何从12个表中获取不匹配的记录

mysql - 对于所有列都使用外键的表进行重复删除插入的解决方法

sql - 检查 clob 是否包含字符串 oracle

java - 将 java 对象保存到 PostgreSQL 问题