Tôi có một tình huống mà hai người có thể làm việc trên cùng một thứ tự (được lưu trữ trong cơ sở dữ liệu MS SQL) từ hai máy tính khác nhau. Để ngăn chặn mất dữ liệu trong trường hợp một người sẽ lưu bản sao của đơn đặt hàng trước, và sau đó một chút, lần thứ hai sẽ lưu bản sao của mình và ghi đè lên bản sao đầu tiên, tôi đã thêm séc vào trường lastSaved (datetime) trước tiết kiệm.MS SQL datetime vấn đề chính xác
Mã này sẽ gần như thế này:
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;
}
}
này làm việc cho hầu hết thời gian, nhưng tôi đã tìm thấy một lỗi nhỏ.
Nếu orderIsChangedByOtherUser lợi nhuận sai, bản sao cục bộ sẽ có nó lastSaved được cập nhật đến thời điểm hiện tại và sau đó được tiếp tục tồn cơ sở dữ liệu. Giá trị của lastSaved trong bản sao cục bộ và DB giờ đây sẽ giống nhau. Tuy nhiên, nếu orderIsChangedByOtherUser được chạy lại, đôi khi trả về đúng mặc dù không có người dùng nào khác đã thực hiện thay đổi đối với DB.
Khi gỡ lỗi trong Visual Studio, databaseOrder.LastSaved và localOrderCopy.LastSaved dường như có giá trị như nhau, nhưng khi nhìn gần hơn họ một số lần khác nhau bởi một vài mili giây.
tôi thấy this article với một thông báo ngắn về độ chính xác millisecond cho datetime trong SQL:
vấn đề khác là SQL Server cửa hàng DATETIME với một độ chính xác của 3,33 mili giây (0. 00.333 giây).
Giải pháp tôi có thể nghĩ về vấn đề này, là so sánh hai thời gian biểu và xem xét chúng bằng nhau nếu chúng khác nhau ít hơn 10 mili giây.
Câu hỏi của tôi với bạn là: có cách nào tốt hơn/an toàn hơn để so sánh hai giá trị datetime trong MS SQL để xem chúng có phải là chính xác là không?
Chỉ cần chỉ định: Tôi không có tùy chọn để thay đổi loại trường * lastSaved *, vì vậy tôi sẽ phải gắn bó với datetime. – Nailuj