我有一种情况,两个人可能从两台不同的计算机上处理相同的订单(存储在MS SQL数据库中).为了防止数据丢失,如果首先保存他的订单副本,然后稍后第二个将保存他的副本并覆盖第一个,我在保存之前添加了对lastSaved字段(datetime)的检查.
代码看起来大致如下:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
这大部分时间都有效,但我发现了一个小bug.
如果orderIsChangedByOtherUser返回false,则本地副本将其lastSaved更新为当前时间,然后保留到数据库.现在,本地副本和DB中的lastSaved值应该相同.但是,如果再次运行orderIsChangedByOtherUser,即使没有其他用户对DB进行更改,它有时也会返回true.
在Visual Studio中进行调试时,databaseOrder.LastSaved和localOrderCopy.LastSaved似乎具有相同的值,但是当仔细观察时,它们会有几次相差几毫秒.
我发现这篇文章是关于SQL中datetime的毫秒精度的简短注意事项:
另一个问题是SQL Server以3.33毫秒(0. 00333秒)的精度存储DATETIME.
我能想到的解决这个问题的方法是比较两个日期时间,如果相差小于10毫秒,则认为它们相等.
那么我的问题是:有没有更好/更安全的方法来比较MS SQL中的两个日期时间值,看它们是否完全相同?