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

时间:2009-11-06 13:20:18

标签: concurrency

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

6 个答案:

答案 0 :(得分:14)

版本号更好,因为无论您使用何种格式的时间,如果服务器的时钟错误或者随着时间的推移而出现错误,它仍然会被抛弃。

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

答案 1 :(得分:4)

我会使用版本号,特别是如果资源的更新时间超过时间戳的分辨率(例如,如果您将时间戳存储到秒的分辨率,如果您在一秒内有多个更新,你的版本将破裂。

答案 2 :(得分:4)

利芬,

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

答案 3 :(得分:3)

版本号。或者,如果我正在使用时间戳,我将确保它是UTC - 因此不会与时区混淆。

答案 4 :(得分:0)

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

如果用户设置了时钟,则时间戳(即使UTC)会出现问题。如果重新启动服务器应用程序,或者如果它溢出(如果它只是一个16位或32位整数),则递增的数字(如果保留在内存中)可能会出现问题。

答案 5 :(得分:-1)

版本号。由于某些原因,DateTime不是唯一的,例如“夏令时” - 可能有两个'2 AM'h。 (Ambiguous Time)。

我猜它的无符号32位整数足够多,因为实际上存在零概率,同时可以节省4,294,967,295个事务。