2009-01-27 9 views
5

में किसी लेनदेन के बाहर आवेषण और अपडेट निष्पादित करने के लिए कैसे करें मैंने SQL सर्वर टी-एसक्यूएल में प्रक्रियाएं संग्रहीत की हैं जिन्हें लेनदेन के दायरे में .NET से बुलाया जाता है।टी-एसक्यूएल

मेरी संग्रहीत प्रक्रिया के भीतर, मैं कुछ ऑडिटिंग टेबल पर कुछ लॉगिंग कर रहा हूं। मैं ऑडिटिंग टेबल में एक पंक्ति डालता हूं, और बाद में लेनदेन में इसे अपडेट के माध्यम से अधिक जानकारी के साथ भर देता हूं।

मुझे जो मिल रहा है, यह है कि यदि कुछ लोग एक ही चीज़ को एक साथ करने की कोशिश करते हैं, तो उनमें से 1 या 2 लेनदेन डेडलॉक पीड़ित बन जाएंगे। फिलहाल मैं मान रहा हूं कि जब मैं ऑडिटिंग टेबल में डाल रहा हूं तो कुछ प्रकार की लॉकिंग हो रही है।

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

क्या कोई मुझे टी-एसक्यूएल में ऐसा करने में मदद कर सकता है?

धन्यवाद, रिच

Update- मैं के बाद से पाया है कि लेखा परीक्षा लेनदेन गतिरोध से संबंधित नहीं था, एसक्यूएल प्रोफाइलर का उपयोग करने का जोश के सुझाव के लिए धन्यवाद गतिरोध के स्रोत को ट्रैक करने की।

+0

क्या आप ऑडिट तालिका में अपनी मुख्य 'हॉट' टेबल पर विदेशी कुंजी रखते हैं? –

+0

की तरह- अगर मैं एक नई पंक्ति डाल रहा हूं, तो मैं एक 'सम्मिलित' ऑडिट रिकॉर्ड बना देता हूं। फिर मैं ऑडिट तालिका से कुंजी सहित नई पंक्ति तैयार करता हूं यह दिखाने के लिए कि किस ऑडिट की गई कार्रवाई ने पंक्ति बनाई है। फिर मैं जो दिखाया गया था उसे दिखाने के लिए, नई पंक्ति की आईडी के साथ ऑडिट रिकॉर्ड अपडेट करता हूं। हालांकि कोई संबंध नहीं है। – Rich

+0

ठीक है मैं बस googled: एसक्यूएल लेनदेन दबाओ, और यह सवाल तीसरा लिंक सोचा था कि मजाकिया – JoshBerke

उत्तर

1

आप ऑडिटिंग टेबल क्यों अपडेट कर रहे हैं? यदि आप केवल आवेषण कर रहे थे तो आप लॉक एस्केलेशन को रोकने में मदद कर सकते हैं। क्या आपने यह तय करने के लिए डेडलॉक ट्रेस की भी जांच की है कि आप वास्तव में क्या डेडलॉकिंग कर रहे थे?

आप इसे trace flag 1204 सक्षम करके कर सकते हैं। या एसक्यूएल प्रोफाइलर चल रहा है। यह आपको विस्तृत जानकारी देगा जो आपको बताएगा कि किस प्रकार की डेडलॉक (ताले, धागे, parrallel आदि ...)।

इस आलेख को Detecting and Ending Deadlocks पर देखें।

ऑडिटिंग करने का एक और तरीका एप्लिकेशन टियर पर सभी लॉगिंग ईवेंट को कतार में भेजकर व्यापार लेनदेन से पूरी तरह से निपटाना है, इससे आपके व्यापार लेनदेन पर प्रभाव लॉगिंग कम हो जाती है लेकिन यह संभवतः मौजूदा के लिए बहुत बड़ी है आवेदन।

+0

मैं एक ऑडिट रिकॉर्ड बनाता हूं, फिर पंक्ति बना देता हूं, फिर पंक्ति के आईडी के साथ ऑडिट रिकॉर्ड अपडेट करता हूं ताकि यह दिखाया जा सके कि क्या बनाया गया था। यह मुझे लेखापरीक्षा रिकॉर्ड की आईडी को पंक्ति में डालने की अनुमति देता है ताकि यह भी दिखाया जा सके कि किस ऑडिट किए गए ईवेंट ने – Rich

+0

क्यों डाला है, तो केवल ऑडिट रिकॉर्ड न बनाएं। मुझे एहसास है कि आपकी समस्या है, – JoshBerke

+0

क्योंकि रिकॉर्ड के पास ऑडिट रिकॉर्ड पर जानकारी नहीं होगी जिसने इसे बनाया- मुझे दो तरह के लिंक पसंद हैं। – Rich

1

आप अपने ऑडिट को टेबल वैरिएबल (जो लेनदेन से प्रभावित नहीं होते हैं) में सहेज सकते हैं और फिर अपने एसपी (लेनदेन के दायरे के बाहर) के अंत में लेखापरीक्षा तालिका में पंक्तियां डाल सकते हैं।

हालांकि, ऐसा लगता है कि आप समस्या के बजाय लक्षणों को ठीक करने की कोशिश कर रहे हैं। आप डेडलॉक्स को ट्रैक करना और उन्हें ठीक करना चाहते हैं।

5

TranactionScope दबाने का समर्थन करता है:

using (TransactionScope scope = new TransactionScope()) 
{ 

    // Transactional code... 


    // Call a SQL stored procedure (but suppress the transaction) 
    using (TransactionScope suppress = new TransactionScope(TransactionScopeOption.Suppress)) 
    { 
     using (SqlConnection conn = new SqlConnection(...)) 
     { 
      conn.Open(); 
      SqlCommand sqlCommand = conn.CreateCommand(); 
      sqlCommand.CommandType = CommandType.StoredProcedure; 
      sqlCommand.CommandText = "MyStoredProcedure"; 
      int rows = (int)sqlCommand.ExecuteScalar(); 
     } 
    } 

    scope.Complete(); 

} 

लेकिन मैं सवाल करने के लिए क्यों प्रवेश/लेखा परीक्षा लेनदेन के बाहर चल पाएंगे पड़ेगा? यदि लेनदेन वापस लुढ़का जाता है तो भी आपने ऑडिटिंग/लॉगिंग रिकॉर्ड किए होंगे और शायद वह नहीं है जो आप चाहते हैं।

आपने लॉगिंग के तरीके के बारे में अधिक जानकारी प्रदान नहीं की है। क्या आपकी ऑडिट तालिका में विदेशी कुंजी आपके मुख्य सक्रिय टेबल पर वापस इंगित करती हैं? यदि ऐसा है, तो विदेशी कुंजी को हटाएं (मानते हैं कि लेखापरीक्षा रिकॉर्ड केवल 'ज्ञात' अनुप्रयोगों से आते हैं)।

+0

हाय, मैं .NET की बजाय टी-एसक्यूएल के भीतर लेनदेन को दबाकर था। रिश्तों के साथ कोई विदेशी कुंजी नहीं है लेकिन मैं ऑडिट तालिका से और उसके अंदर शामिल तालिकाओं की चाबियाँ रिकॉर्ड करता हूं। – Rich

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