5

मैं एक सिंक्रनाइज़र सॉफ्टवेयर लिख रहा हूं जो एक डीबी में सभी बदलाव करेगा और उन्हें दूसरे डीबी में सिंक्रनाइज़ करेगा। यह अंत करने के मैं अपने टेबल T दो कॉलम में जोड़ दिया है:क्या इस अद्यतन वक्तव्य में कोई संभावित दौड़ स्थिति है?

alter table T add LastUpdate rowversion, LastSync binary(8) not null default 0 

अब मैं आसानी से सभी पंक्तियों कि पिछले तुल्यकालन के बाद से बदल गया है चुन सकते हैं:

select * from T where LastUpdate > LastSync 

हालांकि तुल्यकालन मैं अनुरूप प्रदर्शन के बाद दो फ़ील्ड बराबर बनाओ। लेकिन पंक्ति को अद्यतन करने से टाइमस्टैम्प भी अपडेट हो जाता है, इसलिए मुझे यह करना होगा:

update T set [email protected]@DBTS+1 where [email protected] 

लेकिन मुझे आश्चर्य है - क्या यह हमेशा काम करेगा? क्या होगा यदि मैंने @@DBTS के मान को पढ़ा है और फिर कोई अन्य उपयोगकर्ता मेरी पंक्ति से पहले कहीं भी पंक्ति को सम्मिलित/अपडेट करने का प्रबंधन करता है? क्या यह जोखिम भरा कोड है? और यदि हां - इसे बेहतर कैसे बनाया जा सकता है?

+0

वैसे भी SQL सर्वर का संस्करण और संस्करण किस पर है? क्या [डेटा बदलें कैप्चर] (http://msdn.microsoft.com/en-us/library/bb522489.aspx) एक विकल्प है? –

+0

@ मार्टिन स्मिथ - 2008, मुझे लगता है। सुनिश्चित नहीं है कि ग्राहक क्या है। –

+0

@ मार्टिन स्मिथ - मैंने परिवर्तन डेटा कैप्चर की जांच की, लेकिन यह एक ओवरकिल होगा। एक साधारण टाइमस्टैम्प पर्याप्त होगा। मुझे केवल यह जानने की जरूरत है कि कौन से रिकॉर्ड अभी भी सिंक किए जाने की आवश्यकता है। मुझे पूरा इतिहास की आवश्यकता नहीं है। –

उत्तर

-1

यदि आप इसे Serializable लेनदेन में चलाते हैं तो कोई अन्य पढ़/लिखने इन तालिकाओं को प्रभावित करने में सक्षम नहीं होंगे। के रूप में वास्तविक डेटा हो सकता है एक अच्छा विचार बिल्कुल भी नहीं है

RepeateableRead भी काम ...

+1

टेबल्स - हाँ। लेकिन '@@ डीबीटीएस' के मूल्य के बारे में क्या? यह किसी भी मेज में संग्रहीत नहीं है! –

+0

@Vilx यदि आप सिंक्रनाइज़ेशन की अवधि के लिए एक विशेष टेबल लॉक लेते हैं तो संभवतः इससे कोई फर्क नहीं पड़ता कि हालांकि किसी अन्य तालिका में किसी ईवेंट द्वारा '@@ डीबीटीएस' बढ़ता है। –

+0

@ मार्टिन स्मिथ - लेकिन पूरे डीबी के लिए @@ डीबीटीएस वैश्विक है। इससे कोई फर्क नहीं पड़ता? अगर मुझे 'LastSync' फ़ील्ड के लिए एक (पुराना) मान मिलता है, और 'LastUpdate' फ़ील्ड' के लिए एक नया, तो मेरा सिंक्रनाइज़ेशन टूटा जाएगा। –

4

भंडारण "LASTSYNC" एक ही तालिका में कर सकते हैं। इसे किसी अन्य तालिका में संग्रहीत करने का प्रयास करें जिसमें पंक्तिवर्ग नहीं है। इस तरह से आप "पंक्ति को अपडेट करने से टाइमस्टैम्प अपडेट भी करते हैं" -प्रोबलेम से बचें।

आपका सिन्क्रोनाइज़र सॉफ्टवेयर तो इस तरह से काम कर सकते हैं:

  • अतिरिक्त मेज से @LastSync मूल्य प्राप्त
  • "का चयन करें @ThisSync = टी से अधिकतम (LASTUPDATE) जहां LASTUPDATE> @LastSync"
  • "टी से चुनें * जहां LastUpdate> @LastSync और LastUpdate < = @ThisSync" सिंक के लिए आपकी पंक्तियां हैं
  • अतिरिक्त तालिका में @ThisSync को "LastSync" के रूप में स्टोर करें।

सिंक्रनाइज़ेशन चलने के दौरान संशोधित प्रविष्टियां अधिकतम() क्वेरी से अधिक पंक्तिवृत्त मान होंगी। अगली बार आपके सिंक्रनाइज़र कहलाए जाने पर उन्हें सिंक्रनाइज़ किया जाएगा।

+0

यह एक विचार है। यदि यह कुछ भी बेहतर नहीं होता है, तो मैं इसे ध्यान में रखूंगा। –