मेरे पास ऐसी स्थिति है जहां दो व्यक्ति दो अलग-अलग कंप्यूटरों से उसी क्रम (एमएस एसक्यूएल डेटाबेस में संग्रहीत) पर काम कर सकते हैं। इस मामले में डेटा हानि को रोकने के लिए, जहां कोई व्यक्ति अपनी ऑर्डर की प्रतिलिपि पहले सहेज लेगा, और उसके बाद थोड़ी देर बाद दूसरी अपनी प्रतिलिपि को सहेज लेगी और पहले ओवरराइट करेगी, मैंने के खिलाफ एक चेक जोड़ा है पिछला सहेजा फ़ील्ड (डेटाटाइम) बचत।एमएस एसक्यूएल डेटाटाइम सटीक समस्या
कोड इस तरह मोटे तौर पर दिखता है:
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 रिटर्न झूठी, स्थानीय प्रति अपनी lastSaved वर्तमान समय पर अद्यतन और उसके बाद डेटाबेस से कायम किया जा होगा। स्थानीय प्रतिलिपि में का अंतिम स्थान का मूल्य और डीबी अब समान होना चाहिए। हालांकि, अगर orderIsChangedByOtherUser फिर से चलाया जाता है, तो कभी-कभी सत्य लौटाता है, भले ही किसी अन्य उपयोगकर्ता ने डीबी में बदलाव नहीं किए हैं।
जब दृश्य स्टूडियो में डीबगिंग, databaseOrder.LastSaved और एक ही मूल्य है दिखाई देते हैं localOrderCopy.LastSaved, लेकिन जब करीब देख वे कुछ समय में कुछ मिलीसेकेंड से भिन्न होते हैं।
मैं एसक्यूएल में दिनांक के लिए मिलीसेकंड परिशुद्धता पर एक अल्प सूचना के साथ this article पाया:
एक और समस्या यह है कि एसक्यूएल सर्वर 3.33 मिलीसेकेंड (0. 00,333 सेकंड) के एक परिशुद्धता के साथ भंडार DATETIME है।
समाधान मैं इस समस्या के बारे में सोच सकता हूं, दो डेटाटाइम की तुलना करना और उन्हें 10 मिलीसेकंड कहने से कम भिन्न होने पर विचार करना चाहिए।
मेरा प्रश्न तब है: क्या एमएस एसक्यूएल में दो डेटाटाइम मानों की तुलना करने के लिए कोई बेहतर/सुरक्षित तरीका है यह देखने के लिए कि क्या वे बिल्कुल समान हैं?
पर सेट है, तो बस निर्दिष्ट करने के लिए: मेरे पास * lastSaved * फ़ील्ड के प्रकार को बदलने का विकल्प नहीं है, इसलिए मुझे डेटाटाइम के साथ चिपकना होगा। – Nailuj