sql - How to check if a proc is already running when called? -
मेरे पीछे का अनुसरण करें जहां मैं उदाहरण के लिए, यदि storedproc_Task1 कॉलिंग storedproc_Task2 , मैं जानना चाहता हूं कि SQL (SQL Server 2012) के पास यह जांचने का तरीका है कि वर्तमान में एक proc चल रहा है या नहीं। । मैं कोड कुछ ऐसी नज़र हैं: storedproc_Task2 हो सकता है दोनों storedproc_Task1 और storedproc_Task3 , मैं चाहता हूँ storedproc_Task1 कॉल करने के लिए storedproc_Task2 केवल 20 सेकंड के बाद <कोड से बुलाया > storedproc_Task3
घोषित @ MyRetCode_Recd_In_Task1 पूर्णांक अगर storedproc_Task2 तो --wait storedproc_Task2 के लिए चल रहा है किसी और खत्म करने के लिए निष्पादित @ MyRetCode_Recd_In_Task1 = storedproc_Task2 (पैरामीटर बुला के साथ यदि कोई हो) । सवाल यह है कि मैं को कैसे संभालता हूं यदि storedproc_Task2 चल रहा है बूलियन चेक?
अद्यतन करें: मैंने शुरू में मेरे संग्रहित प्रक्रियाओं (यानी sp_Task1 ) के लिए सामान्य नामों का उपयोग करते हुए सवाल उठाया था, लेकिन इसके बजाय उन नामों को उपयोग करने के लिए प्रश्न को अपडेट किया है जैसे storedproc_Task1 प्रति रिमाइंडर, उपसर्ग sp_ सिस्टम संप्रतीक के लिए [मास्टर] डेटाबेस में आरक्षित है।
यह देखते हुए कि किसी भी कॉलिंग की इच्छा sp_Task2 है, जब तक sp_Task2 पूर्ण तक प्रतीक्षा करें, अगर यह पहले से ही चल रहा है , जो अनिवार्य रूप से sp_Task2 सिंगल-थ्रेडेड बना रहा है।
यह एप्लिकेशन लॉक के उपयोग के जरिये पूरा किया जा सकता है (देखें और)। एप्लिकेशन लॉक आपको अनियंत्रित अवधारणाओं के आसपास ताले बनाते हैं। मतलब, आप @Resource को "टास्क 2" के रूप में परिभाषित कर सकते हैं जो प्रत्येक कॉलर को अपनी बारी का इंतजार करने के लिए मजबूर कर देगा। यह इस संरचना का पालन करेगा:
BEGIN हस्तांतरण; EXEC sp_getapplock @Resource = 'Task2', @LockMode = 'अनन्य'; ... एकल-थ्रेडेड कोड ... EXEC sp_releaseapplock @Resource = 'Task2'; कॉमिट लेनदेन; आपको त्रुटियों का प्रबंधन करना / खुद को रोलबैक करने की ज़रूरत है (जैसा कि लिंक्ड एमएसडीएन दस्तावेज में बताया गया है) ताकि सामान्य ट्रिये / कैच में डाल दिया जाए लेकिन, यह आपको स्थिति का प्रबंधन करने की अनुमति देता है।
इस कोड को या तो sp_Task2 में आरंभ और अंत में रखा जा सकता है:
प्रक्रिया की गई डीबोरो। सेट 2 के रूप में सेट नाकाउंट; BEGIN हस्तांतरण; EXEC sp_getapplock @Resource = 'Task2', @LockMode = 'अनन्य'; {टास्क 2 proc के लिए वर्तमान तर्क} EXEC SP_releaseapplock @Resource = 'Task2'; कॉमिट लेनदेन; या इसे उन सभी स्थानों में रखा जा सकता है जो sp_Task2 को कॉल करता है, इस प्रकार है:
सेटअप प्रक्रिया dbo.Task1 के रूप में SET NOCOUNT पर; BEGIN हस्तांतरण; EXEC sp_getapplock @Resource = 'Task2', @LockMode = 'अनन्य'; EXEC dbo.Task2 (कॉलिंग मापदंडों के साथ यदि कोई है); EXEC sp_releaseapplock @Resource = 'Task2'; कॉमिट लेनदेन; मुझे लगता है कि पहली पसंद - तर्क को sp_Task2 में रखकर - यह साफ हो जाएगा कि ए) यह एक ही स्थान में है और ख) sp_Task2 वर्तमान में परिभाषित पथ (विज्ञापन हॉक क्वेरी या एक नई प्रक्रिया जो इस एहतियात नहीं लेते हैं) के बाहर कॉल करने वाले किसी व्यक्ति से नहीं बचा जा सकता है।
कृपया मेरा उत्तर देखें
कृपया ध्यान दें: sp_getapplock कोड> / sp_releaseapplock को संयमपूर्वक उपयोग किया जाना चाहिए; एप्लिकेशन लॉक निश्चित रूप से बहुत आसान हो सकते हैं (जैसे कि इस तरह के मामलों में) लेकिन जब केवल आवश्यक हो तो उनका उपयोग किया जाना चाहिए।
Comments
Post a Comment