2010-03-29 12 views
7

मुझे कोई समस्या है मुझे यकीन नहीं है कि कैसे हल करना सबसे अच्छा है।असिंक्रोनस एसक्यूएल ऑपरेशंस

मेरे पास एक ऐसा एप्लिकेशन है जो विज्ञापन अनुरोधों के जवाब में डेटाबेस अपडेट करता है। विशेष रूप से एक अनुरोध काफी आम है। अनुरोध एक अद्यतन है कि स्वयं ही काफी सरल है, लेकिन इसमें कुछ जटिल पूर्व शर्त हैं।

    इस अनुरोध व्यापार परत पहले अनुरोध डेटा स्तर से डेटा का एक सेट के लिए
  • व्यापार तर्क परत डेटाबेस से डेटा और अनुरोध से मापदंडों का मूल्यांकन, से इस कार्रवाई की जानी निर्धारित किया जाता है, और अनुरोध के प्रतिक्रिया संदेश (रों) बनाया जाता है।
  • व्यापार परत अब वास्तविक अद्यतन आदेश निष्पादित करता है जो अनुरोध के उद्देश्य है।

यह अंतिम चरण समस्या है, यह आदेश डेटाबेस की स्थिति पर निर्भर है, जो व्यापार तर्क के बाद से बदल सकता है। डेटाबेस में कई दौर-यात्राओं में इस ऑपरेशन में पढ़ने वाले डेटा को लॉक करना एक अच्छा विचार नहीं लगता है। क्या ऐसा कुछ करने के लिए 'सर्वश्रेष्ठ अभ्यास' तरीका है? धन्यवाद!

उत्तर

2

सरल शब्दों में जब आप अद्यतन कमांड निष्पादित करते हैं तो आप चिंतित हैं कि डेटाबेस बदल सकता है?

फिर संग्रहित प्रक्रियाओं को कॉल करें जो रक्षात्मक रूप से लिखे गए हैं और केवल तभी अपडेट होंगे जब डेटा को स्वीकार्य स्थिति में रखा जाता है (विदेशी कुंजी संदर्भों, डेटा अखंडता आदि की जांच करके)।

मुझे बताएं कि क्या मैं इसके कुछ पहलू को मजाक करने में मदद कर सकता हूं।

+0

हां, लेकिन यह संग्रहीत प्रक्रिया में व्यावसायिक तर्क (जिसे मैं आसानी से बदलना चाहता हूं) डालता हूं। – Paul

+1

@ पॉल, अगर संग्रहीत प्रो केवल यह सत्यापित करने की जांच नहीं कर रहा है कि डेटा बदल नहीं गया है। मैं तर्क दूंगा कि यदि आप बीएल में कर रहे हैं तो अपडेट करने के लिए सही तालिका/कॉलम निर्धारित करने के लिए शर्तों की जांच कर रहे हैं, जो किसी भी संग्रहित प्रो में होना चाहिए। – AllenG

+0

यह जांचना कि रेफरेंसियल अखंडता और विदेशी कुंजी ठीक रहेगी, सबसे अच्छा अभ्यास है, डीबी निहित रूप से संरचना और मेटाडाटा (स्पष्ट रूप से प्रदूषित प्रक्रियात्मक कोड के माध्यम से) के माध्यम से व्यावसायिक तर्क का समर्थन करता है, यह भी अच्छा अभ्यास है। – amelvin

2

आप संशोधित व्यावसायिक वस्तुओं की मूल स्थिति को संग्रहीत कर सकते हैं और मूल ऑब्जेक्ट्स को अपने डेटाबेस समकक्षों से तुलना कर सकते हैं ताकि यह जांच सके कि कुछ भी बदल गया है या नहीं।

यदि परिवर्तन किए गए हैं, तो आपके पास मूल, संशोधित और संग्रहीत (डेटाबेस) ऑब्जेक्ट्स के आधार पर ऑब्जेक्ट्स को मर्ज करने का विकल्प है, या अपडेट को रद्द करने और क्लाइंट को बताएं कि अपडेट विफल हो गया है।

+1

यहां कुछ Google कीवर्ड हैं: ऊपर वर्णित रणनीति को 'आशावादी समेकन नियंत्रण' भी कहा जाता है, इसके परिष्कृत अवतारों में, हम 'कोरियोग्राफी', 'व्यवसाय प्रक्रिया प्रबंधन' और 'क्षतिपूर्ति लेनदेन' के बारे में भी बात करते हैं, 'सगा' । विकल्प जब आप लेनदेन शुरू करते हैं तो डेटा (पूरे डेटाबेस, या केवल जो आपने स्पर्श किया/देखा, पूर्ण लॉक या केवल लॉक लिखना) लॉक करना है और ऑपरेशन पूरा होने तक सभी लोग प्रतीक्षा कर सकते हैं - यह मूल रूप से 'निराशावादी' कहलाता है समरूपता नियंत्रण'। – ddimitrov

0

यह बहुत मुश्किल है, क्योंकि इस सवाल में कई विशिष्टताएं नहीं हैं, इसलिए मैं केवल एक साधारण उदाहरण दूंगा कि आप अपनी स्थिति पर आवेदन करने में सक्षम हो सकते हैं।

लोड सभी डेटा साथ ही पिछले बदल तिथि (yyyy-mm-dd hh: मील: ss.mmm)

SELECT AAA,BBB,LastChgDate FROM YourTable WHERE ID=xxxxxx 

अपने व्यापार तर्क करना

डेटा को बचाने

UPDATE YourTable SET AAA=aaaaa,BBB=bbbbb WHERE ID=xxxxxx AND LastChgDate=zzzzzz 

यदि पंक्ति गिनती है! = 1 फिर त्रुटि किसी और ने डेटा बदल दिया है, अन्यथा डेटा सहेजा गया है।

+0

यह * पैटर्न * को आशावादी समेकन नियंत्रण कहा जाता है: http://en.wikipedia.org/wiki/Optimistic_concurrency_control –

0

एक उचित लेनदेन अलगाव मोड का उपयोग करें और गायक डेटाबेस लेनदेन में सबकुछ करें (यानी चरण 1 में लेनदेन शुरू करें और चरण 3 के बाद प्रतिबद्ध करें)।

आपका प्रश्न थोड़ा अस्पष्ट है, लेकिन मेरा अनुमान है कि आपको या तो स्नैपशॉट की आवश्यकता है या कमांड मोड पढ़ें।

संबंधित मुद्दे