Concurrency 乐观并发的版本号或时间戳?

Concurrency 乐观并发的版本号或时间戳?,concurrency,Concurrency,您希望使用版本号(将递增)还是时间戳来检查并发问题?版本号。或者,如果我使用的是时间戳,我会确保它是UTC,这样就不会与时区混淆 我会使用版本号,特别是当资源的更新可能超过时间戳的分辨率时(例如,如果您将时间戳存储为秒的分辨率,如果您在一秒钟内有多个更新,您的版本控制将中断)。版本号更好,因为无论您使用何种时间格式,如果服务器的时钟出错或随着时间的推移出错,它仍然可以被丢弃 我必须承认,我在许多数据库中使用了时间戳,因为它可以用于并发性检查以及数据上次更改时间的可读性。但是,使用版本号确实是更好

您希望使用版本号(将递增)还是时间戳来检查并发问题?

版本号。或者,如果我使用的是时间戳,我会确保它是UTC,这样就不会与时区混淆

我会使用版本号,特别是当资源的更新可能超过时间戳的分辨率时(例如,如果您将时间戳存储为秒的分辨率,如果您在一秒钟内有多个更新,您的版本控制将中断)。

版本号更好,因为无论您使用何种时间格式,如果服务器的时钟出错或随着时间的推移出错,它仍然可以被丢弃

我必须承认,我在许多数据库中使用了时间戳,因为它可以用于并发性检查以及数据上次更改时间的可读性。但是,使用版本号确实是更好的方法。

Lieven

我知道您没有指定SQL Server,但是如果您谈论的是SQL Server,那么数据类型时间戳将是最好的使用方法。尽管有它的描述,但它实际上与日期和时间无关。它实际上只是一个二进制数,每次修改行时都会发生变化。因此,如果对行进行了任何修改,那么您知道时间戳列将发生更改。这比版本号有优势,因为程序员不必“维护”版本号。
实际日期/时间戳需要更仔细地使用,因为另一张海报提到了之前的时间差异等。

如果您在Windows上,我建议使用全局唯一标识符(GUID)作为版本标识符


如果时钟由用户设置,时间戳(即使UTC)也会产生问题。如果服务器应用程序重新启动或溢出(如果仅为16位或32位整数),递增的数字(如果保留在内存中)可能会出现问题。

版本号。由于某些原因,DateTime不是唯一的,例如“夏令时”-可能有两个“凌晨2点”小时。().


我想这已经足够了,因为实际上,在保存4294967295事务时,发生该事务的概率为零。

是的,idd,我已经有一个列ModifiedOn,并且正在考虑使用它,但是您会建议增加一个列吗?是的。虽然我讨厌在一个表中有很多列,但这是一个更可靠的解决方案。因为吉姆的回答,我有点困惑。如果修改行时时间戳自动更改,那么这是非常有用的。你所说的“它仍然可以扔掉”是什么意思?我想你会发现我提到过“尽管它的描述与日期和时间无关”,我需要将时间戳映射到哪种类型?因为在更新或删除之前,我想检查并发性问题。(我正在使用SQLServer.Flex WebORB-.NET SQLServer)。我们正在向Flex发送dto。在那个dto里我需要加上时间戳。每当dto返回保存时,我都需要检查dto中的时间戳是否对应于数据库中的时间戳。这里有一些关于它的聊天:但是,你考虑过允许服务器处理版本吗?如果您使用的是乐观锁定,那么您的sql插入将检测到问题并引发异常。我打算这样做,让sql插入检测到问题。但是您是否需要将时间戳发送到客户端?如果要插入,则需要将db中的时间戳与对象中的时间戳进行比较。还是我遗漏了什么?我现在很困惑,因为纽约系统分析师的答案。这个时间戳会出问题吗?在我看来,他说的是实际的日期和时间,而不是时间戳数据类型。听起来时间戳数据类型是您前进的方向。您不使用DateTime。使用时间戳。是UTC。不一致的原因不同,例如服务器时钟漂移。