SQL中是否存在冲突自动时间戳?
问题描述:
我有一个PostgreSQL表,其中一个字段是一个自动时间戳字段(SET DEFAULT CURRENT_TIMESTAMP
)。该领域的精度为微秒级。是否有可能具有相同时间戳的行或者PostgreSQL的并发控制是否对对象更新施加序列排序?SQL中是否存在冲突自动时间戳?
答
是的。即使您使用clock_timestamp()
,您每次都会得到一个新的时间戳,即使您的系统具有微秒计时精度,也可能发生冲突。
微秒计时精度并不意味着微秒计时器精度或分辨率。时钟在“跳跃”中前进。在某些系统中,这些跳转是亚微秒(μs),对于像PostgreSQL这样的以微秒计时器分辨率工作的应用程序是不可见的。但是在一些系统中,它们可能是几十毫秒或几百毫秒!
在Windows 8和Server 2012(及其被PostgreSQL 9.5采用)中引入GetSystemTimePreciseAsFileTime
之前的MS Windows时间被限制为1毫秒(ms)的分辨率,并且通常为15ms分辨率!所以它是非常可能会得到相同的时间价值的多个呼叫系统是除了大多数空闲的任何东西。
在现代Linux上,或者在具有最新PostgreSQL的现代Windows上,由于亚毫秒定时器分辨率而导致冲突的可能性小得多。但他们绝对有可能。如果您选择使用时间戳作为唯一键,那么您的应用必须能够在发生唯一违规时重试。
答
这是可能的。
看看有大约5000万个条目的PostgreSQL表,我看到大约70组条目在自动时间戳字段中具有相同的时间戳。
https://www.postgresql.org/docs/9.6/static/functions-datetime.html#FUNCTIONS-DATETIME-CURRENT:current_timestamp绑定到事务的开始,所以插入/更新的多行相同的事务将具有相同的时间戳。 – wildplasser