У меня есть ситуация, когда два человека могут работать в одном и том же порядке (хранятся в базе данных MS SQL) с двух разных компьютеров. Чтобы предотвратить потерю данных в случае, когда сначала нужно сохранить его копию заказа, а затем немного позже, когда второй сохранит свою копию и перезаписать первое, я добавил проверку в поле lastSaved (дата и время) перед сохранением.
Код выглядит примерно так:
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;
}
}
Это работает большую часть времени, но я нашел одну маленькую ошибку.
Если orderIsChangedByOtherUser возвращает false , локальная копия будет обновлена до lastSaved до текущего времени и затем сохранена в базе данных. Значение lastSaved в локальной копии и БД теперь должно быть одинаковым. Однако, если orderIsChangedByOtherUser запускается снова, он иногда возвращает true , даже если никакой другой пользователь не внес изменения в БД.
При отладке в Visual Studio databaseOrder.LastSaved и localOrderCopy.LastSaved имеют одно и то же значение, но при ближайшем рассмотрении они несколько раз отличаются на несколько миллисекунд.
Я нашел этой статьи с коротким уведомлением о точности в миллисекундах для даты и времени в SQL:
Другая проблема заключается в том, что SQL Server
магазины DATETIME с точностью до
3,33 миллисекунды (0,00333 секунды).
Решение, которое я мог бы придумать для этой проблемы, состоит в том, чтобы сравнить две даты и время и считать их равными, если они отличаются менее, чем, скажем, на 10 миллисекунд.
Тогда у меня вопрос к вам: есть ли более эффективные / более безопасные способы сравнения двух значений даты и времени в MS SQL, чтобы определить, являются ли они точно одинаковыми?