我有两个人可能在两台不同的计算机上以相同的顺序工作(存储在MS SQL数据库中)的情况。为防止数据丢失的情况下,人们会先保存他的订单副本,然后稍后第二次将保存他的副本并覆盖第一个,我已经添加了一个检查lastSaved字段(日期时间)之前保存。MS SQL日期时间精度问题
代码看起来大致是这样的:
private bool orderIsChangedByOtherUser(Order localOrderCopy)
{
// Look up fresh version of the order from the DB
Order databaseOrder = orderService.GetByOrderId(localOrderCopy.Id);
if (databaseOrder != null &&
databaseOrder.LastSaved > localOrderCopy.LastSaved)
{
return true;
}
else
{
return false;
}
}
这适用于大多数的时间,但我发现一个小bug。
如果orderIsChangedByOtherUser返回假,本地副本将拥有lastSaved更新为当前时间,然后被持久化到数据库中。 lastSaved的值在本地副本和数据库现在应该是相同的。但是,如果orderIsChangedByOtherUser再次运行,它有时返回true即使没有其他用户已经更改数据库。
当在Visual Studio调试,databaseOrder.LastSaved和localOrderCopy.LastSaved似乎有相同的值,但仔细一看时,他们有时用几毫秒不同。
我发现this article与在SQL毫秒精度日期时间的简短声明:
另一个问题是,SQL服务器 店DATETIME与 3.33毫秒(000333秒)精度。
对于这个问题,我能想到的解决方案是比较两个日期时间,并认为它们相等,如果它们的差异小于10毫秒。
我给你的问题是:是否有更好/更安全的方法来比较MS SQL中的两个日期时间值,看它们是否与正好一样?
只需指定:我没有选择更改* lastSaved *字段的类型,因此我必须坚持使用日期时间。 – Nailuj 2010-04-12 08:17:20