2011-06-15 20 views
32

मैं इस पर डेढ़ साल से इस पर काम कर रहा हूं, और वेब पर संख्यात्मक ब्लॉग और सहायता लेखों की खोज की है। मुझे इस त्रुटि से संबंधित SO पर कई प्रश्न मिले, लेकिन मुझे नहीं लगता कि वे मेरी स्थिति पर काफी लागू हैं (या कुछ मामलों में, दुर्भाग्यवश, मैं उन्हें लागू करने के लिए पर्याप्त रूप से समझ नहीं पाया: पी)। मुझे यकीन नहीं है कि मैं मदद के लिए पर्याप्त रूप से इसका वर्णन कर सकता हूं ... लेकिन यहां जाता है:"यह एसक्यूएलट्रांसक्शन पूरा हो गया है, यह अब उपयोग करने योग्य नहीं है।" ... कॉन्फ़िगरेशन त्रुटि?

हमारे पास हमारे संसाधनों को ट्रैक करने के लिए एक .NET ऐप है। संसाधन ट्रैकिंग समय और बिलिंग प्रणाली में संसाधन की प्रतिलिपि बनाने के लिए एक निर्यात कार्य है; यह संग्रहीत प्रक्रिया तक पहुंचता है जो समय और बिलिंग डेटाबेस से लिंक होता है।

मैंने हाल ही में बिलिंग सिस्टम डेटाबेस को एक नए सर्वर (मूल सर्वर: सर्वर 2003 एसपी 2, एसक्यूएल 2005; नया सर्वर: सर्वर 2008 आर 2, एसक्यूएल 2008 आर 2) में स्थानांतरित कर दिया है। मेरे पास एक लिंक सर्वर है जो 2008 डेटाबेस को इंगित करता है। मैंने 2008 सर्वर को इंगित करने के लिए संग्रहीत प्रक्रिया को अद्यतन किया, और फिर मुझे एमएसडीटीसी और आरपीसी (http://www.safnet.com/writing/tech/archives/2007/06/server_myserver.html) के बारे में एक त्रुटि मिली। मैंने लिंक किए गए सर्वर पर 'आरपीसी/आरपीसी आउट' सक्षम किया है और नेटवर्क एक्सेस की अनुमति देने के लिए एमएसडीटीसी सेट किया है (इस तरह कुछ: http://www.sqlwebpedia.com/content/msdtc-troubleshooting)।

अब मैं उपरोक्त प्राप्त कर रहा हूं, जब मैं निर्यात फ़ंक्शन चलाने की कोशिश करता हूं: "यह एसक्लट्रांसक्शन पूरा हो गया है, यह अब उपयोग करने योग्य नहीं है।" मेरे लिए अजीब लगता है कि जब मैं सिर्फ संग्रहीत प्रक्रिया (एसएसएमएस से) चलाता हूं, तो यह कहता है कि यह सफलतापूर्वक पूर्ण हो जाता है।

क्या किसी ने इसे पहले देखा है? क्या मुझे कॉन्फ़िगरेशन में कुछ याद आया है? मैं एक ही पेज पर जा रहा हूं, और मुझे मिली एकमात्र चीज़ यह थी कि एमएसडीटीसी परिवर्तन करने के बाद मैंने रीबूट नहीं किया (यहां उल्लेख किया गया है: http://social.msdn.microsoft.com/forums/en-US/adodotnetdataproviders/thread/7172223f-acbe-4472-8cdf-feec80fd2e64/)।

यदि मैं मदद करता हूं तो मैं भाग या सभी संग्रहीत प्रक्रिया पोस्ट कर सकता हूं ... कृपया मुझे बताएं।

+0

http://stackoverflow.com/a/15923556/ 900284 –

उत्तर

31

मुझे विश्वास है कि यह त्रुटि संदेश "ज़ोंबी लेनदेन" के कारण है।

संभावित क्षेत्रों की तलाश करें जहां ट्रांक्टैक्ट दो बार किया जा रहा है (या दो बार वापस लुढ़का हुआ है, या वापस लुढ़का हुआ है और प्रतिबद्ध है)। क्या एसपी पहले ही इसे प्रतिबद्ध करने के बाद नेट कोड लेनदेन करता है? क्या नेट कोड एक त्रुटि का सामना करने पर इसे वापस रोल करता है, फिर उसे कैच (या अंत में) खंड में फिर से रोल करने का प्रयास करें?

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

क्या आप त्रुटि कोड में डीबग कर सकते हैं? क्या आपके पास एक स्टैक ट्रेस है?

+2

ऐसा लगता है कि यह सही रास्ते पर है ... मुझे एक और टूल (dtctester) मिला और मेरी मूल त्रुटि गलत कॉन्फ़िगरेशन के कारण थी (मैंने सोचा कि मैंने नए सर्वर पर फ़ायरवॉल की जांच की है ... अनुमान है कि मुझे यही मिलता है कल्पना करते हुए)।ऐसा लगता है कि मेरी नई त्रुटि आप जो कह रहे हैं उससे मेल खाती है, "EXECUTE के बाद लेनदेन की गणना इंगित करती है कि एक COMMIT या रोलबैक ट्रांज़ेक्शन कथन गुम है। पिछली गिनती = 1, वर्तमान गणना = 2." मुझे थोड़ा और खुदाई करना होगा और आपसे वापस आना होगा। –

+2

मुझे लगता है कि कोड में डुप्लिकेट था ... मैंने संग्रहीत प्रक्रिया में रोलबैक लेनदेन की टिप्पणी की, और ऐसा लगता है कि अब सबकुछ काम कर रहा है। मैं उपयोगकर्ता की जांच करने का इंतजार कर रहा हूं, लेकिन यह उस बिंदु से पिछड़ा हो रहा है जहां यह पहले त्रुटि कर रहा था। :) इनपुट के लिए धन्यवाद! –

3

मैंने हाल ही में इसी तरह की स्थिति में भाग लिया है। किसी भी वीएस आईडीई संस्करण में डीबग करने के लिए, डीबग (Ctrl + D, E) से अपवाद खोलें - "थ्रोउन" कॉलम के विरुद्ध सभी चेकबॉक्स चेक करें, और एप्लिकेशन को डीबग मोड में चलाएं। मुझे एहसास हुआ है कि नए डेटाबेस में टेबलों में से एक को ठीक तरह से आयात नहीं किया गया था, इसलिए आंतरिक एसक्यूएल अपवाद कनेक्शन को मार रहा था, इस प्रकार इस त्रुटि में परिणाम हुआ।

कहानी का सार है, इससे पहले काम कर कोड एक नया डेटाबेस पर इस त्रुटि देता है, इस डेटाबेस स्कीमा मुद्दा याद आ रही हो सकता है, इसके बाद के संस्करण डिबगिंग टिप द्वारा एहसास,

आशा है कि यह मदद करता है, HydTechie

+0

टिप के लिए धन्यवाद, एक वास्तविक बारोक (पहियों के अंदर पहियों के अंदर पहियों .....) विरासत अनुप्रयोग के माध्यम से जा रहा है और इससे – orgtigger

4

मैंने हाल ही में एक नए कनेक्शन मैनेजर में रिफैक्टरिंग के बाद यह किया था।तो यह एक बैच के हिस्से के रूप में चलाया जा सकता है एक नया दिनचर्या एक सौदे को स्वीकार कर लिया, समस्या एक का उपयोग कर ब्लॉक के साथ किया गया था:

public IEnumerable<T> Query<T>(IDbTransaction transaction, string command, dynamic param = null) 
{ 
    using (transaction.Connection) 
    { 
    using (transaction) 
    { 
     return transaction.Connection.Query<T>(command, new DynamicParameters(param), transaction, commandType: CommandType.StoredProcedure); 
    } 
    } 
} 

यह है जैसे कि बाहरी अंतर्निहित कनेक्शन इस प्रकार किसी भी करने का प्रयास करता या रोलबैक बंद करने गया था का उपयोग कर लग रहा है लेनदेन ने संदेश "This SqlTransaction has completed; it is no longer usable."

मैंने निकायों को एक कवर टेस्ट जोड़ा और समस्या दूर हो गई।

public IEnumerable<T> Query<T>(IDbTransaction transaction, string command, dynamic param = null) 
{ 
    return transaction.Connection.Query<T>(command, new DynamicParameters(param), transaction, commandType: CommandType.StoredProcedure); 
} 

किसी लेनदेन के संदर्भ में कनेक्शन बंद होने पर कुछ भी जांचें।

2

मेरे मामले में समस्या यह थी कि लेनदेन में शामिल प्रश्नों में से एक अपवाद उठा रहा था, और भले ही अपवाद "कृपापूर्वक" संभाला गया था, फिर भी यह पूरे लेनदेन को वापस करने में कामयाब रहा।

var transaction = connection.BeginTransaction(); 
for(all the lines in a file) 
{ 
    try{ 
     InsertLineInTable(); // INSERT statement might fail and throw an exception 
    } 
    catch { 
     // notify the user about the error on line x and continue 
    } 
} 

// Commit and Rollback will fail if one of the queries 
// in InsertLineInTable threw an exception 
if(CheckTableForErrors()) 
{ 
    transaction.Commit(); 
} 
else 
{ 
    transaction.Rollback(); 
} 
1

मैं एक ही समस्या है:

मेरे छद्म कोड की तरह था। यह त्रुटि तब होती है क्योंकि कनेक्शन पूलिंग। जब मौजूद होता है तो दो या दो से अधिक उपयोगकर्ता सिस्टम को स्वीकार करते हैं, तो कननेट पूलिंग एक कननेट और ट्रांसलेशन का पुन: उपयोग करती है। यदि पहला उपयोगकर्ता निष्पादित करता है तो रोलबैक कहां लेनदेन करना लंबे समय तक प्रयोग योग्य नहीं है।

+1

समस्या को कम करने में मदद मिली यह मेरी समस्या भी है क्योंकि यह केवल तभी होता है जब एक से अधिक उपयोगकर्ता होते हैं आवेदन में। इसे ठीक करने का कोई तरीका? – boilers222

0

यहाँ ज़ोंबी लेन-देन

SqlTransaction trans = connection.BeginTransaction(); 

//some db calls here 

if (trans.Connection != null) //Detecting zombie transaction 
{ 
    trans.Commit(); 
} 

का पता लगाने के लिए एक रास्ता है Decompiling SqlTransaction वर्ग, आप देखेंगे निम्नलिखित

public SqlConnection Connection 
{ 
    get 
    { 
    if (this.IsZombied) 
     return (SqlConnection) null; 
    return this._connection; 
    } 
} 

मैं अगर कनेक्शन बंद कर दिया जाता है, transOP ज़ोंबी हो जाएगा नोटिस, इस प्रकार Commit नहीं हो सकता है। मेरे मामले में, ऐसा इसलिए है क्योंकि मेरे पास Commit()finally ब्लॉक के अंदर है, जबकि कनेक्शन try ब्लॉक में था। यह व्यवस्था कनेक्शन को निपटाने और कचरा एकत्र करने का कारण बन रही है। समाधान को try ब्लॉक के अंदर डालना था।

1

डीबी के खिलाफ अपने .NET ऐप से निष्पादित किसी भी लंबी चल रही प्रक्रियाओं को भी जांचें।

  • निष्पादन समय समाप्ति सीमा समाप्त: उदाहरण के लिए यदि आप एक संग्रहीत प्रक्रिया या क्वेरी जो खत्म करने के लिए जो के रूप में अपने लॉग में दिखा सकते हैं के लिए पर्याप्त समय नहीं है कॉल कर रहे हैं। टाइमआउट अवधि से पहले समाप्त हो गई है या ऑपरेशन पूरा हो रहा है या सर्वर प्रतिक्रिया नहीं दे रहा है।

    • यह एसक्लट्रांसक्शन पूरा हो गया है; यह अब उपयोग करने योग्य नहीं है।

चेक आदेश टाइमआउट सेटिंग एक निशान (प्रोफाइलर) चलाने के लिए और देखो क्या डीबी पक्ष पर हो रहा है की कोशिश करो ...

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