2012-09-13 19 views
8

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

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

हालांकि मैं इसे लागू करने के लिए संघर्ष कर रहा हूं।

कोड (मानक CoreService WCF क्लाइंट का उपयोग) काम कर रहे:

TransactionOptions txOptions = new TransactionOptions 
        { IsolationLevel = IsolationLevel.ReadCommitted }; 
using(TransactionScope scope = new TransactionScope(
          TransactionScopeOption.Required, txOptions)) 
{ 
    PublicationTargetData publicationTarget1 = (PublicationTargetData)client.Read("tcm:0-1-65537", readOptions); 
    PublicationTargetData publicationTarget2 = (PublicationTargetData)client.Read("tcm:0-2-65537", readOptions); 

    publicationTarget1.TargetLanguage = "JSP"; 
    publicationTarget2.TargetLanguage = "JSP"; 
    client.Save(publicationTarget1, readOptions); 
    client.Save(publicationTarget2, readOptions); 

    // Stop saving 
    scope.Dispose(); 
} 

इस कोड को सफलतापूर्वक (अगर मैं scope.Dispose() से पहले तोड़ परिवर्तन मैंने किया था वापस रोल और Tridion में प्रकाशन के लक्ष्यों की जाँच करेगा निष्पादित इसे सफलतापूर्वक लक्ष्य में परिवर्तन , और फिर परिवर्तन को "पूर्ववत" करता है)।

यदि अब मैं लेनदेन में अपने "विस्तारित प्रकाशन लक्ष्य" वर्ग का उपयोग करने का प्रयास करता हूं, तो मैं इसका निपटान नहीं कर सकता।

TransactionOptions options = new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted }; 
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, options)) 
{ 
    ExtendedPublicationTarget target1 = new ExtendedPublicationTarget("tcm:0-1-65537"); 
    ExtendedPublicationTarget target2 = new ExtendedPublicationTarget("tcm:0-2-65537"); 
    target1.Destinations.Add(target1.Destinations[0]); 
    target2.Destinations.Add(target2.Destinations[0]); 
    target1.Save(); 
    target2.Save(); 
    scope.Dispose(); 
} 

तो मूल रूप से, इस सवाल यह है: मैं अपने .save() विधि को transactionality जोड़ने के लिए क्या करना चाहिए?

मैं यह कर की कोशिश की है:

[OperationContract] 
[TransactionFlow(TransactionFlowOption.Allowed)] 
public void Save() 
{ 
    _client.Save(targetData, readOptions); 
} 

लेकिन यह एक फर्क नहीं किया। क्या यह निर्धारित करने का कोई तरीका है कि क्या मैं वर्तमान में लेनदेन में हूं और किसी भी तरह से लेनदेन का उपयोग करता हूं? मैं एक लेनदेन की आवश्यकता नहीं चाहता, सिर्फ एक में काम करने का विकल्प चाहते हैं।

धन्यवाद, और बहुत लंबी पोस्ट के लिए खेद है ... यह सुनिश्चित करना चाहता था कि मैंने जितना संभव हो उतना जानकारी प्रदान की हो।

+0

चूंकि आपके पास 'उपयोग' खंड में 'स्कोप' चर है, इसलिए आपको स्पष्ट रूप से 'निपटान' को कॉल नहीं करना चाहिए। इसके बजाय 'उपयोग' ब्लॉक समाप्त होने पर इसे स्वचालित रूप से निपटाया जाएगा। –

+0

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

+0

हे फ्रैंक, मैं इसे असफल बनाने की कोशिश कर रहा हूं, इसलिए मेरा दायरा। (कॉल करें) कॉल करें। पहले उदाहरण में यह सही ढंग से विफल रहता है, और दूसरे पर यह नहीं करता है। यह समझने की कोशिश कर रहा हूं कि इसे मेरी कक्षा में जोड़ने के लिए मुझे क्या करना है ... –

उत्तर

3

इसके लिए सबसे अच्छा स्रोत है: WCF Transaction Propagation

आप कम से कम एक कदम याद कर रहे हैं। तुम भी बंधन में लेनदेन सक्षम करना होगा:

<bindings> 
    <netTcpBinding> 
     <binding name = “TransactionalTCP” transactionFlow = “true” /> 
    </netTcpBinding> 
</bindings> 

यह तय करने के अगर मैं एक सौदे में वर्तमान में हूँ और किसी भी तरह कि लेन-देन "का उपयोग" कोई तरीका है?

हां। यह निर्धारित करने के लिए कि क्या आप लेनदेन में हैं या नहीं, आप लेनदेन की जांच कर सकते हैं। वर्तमान। यदि आप एक लेनदेन में हैं, तो आप इसका उपयोग तब तक करेंगे जब तक आप स्पष्ट रूप से ऑप्ट आउट नहीं करते। परिवेश लेनदेन के बारे में यह सुंदर/भयानक बात है।

चित्रा 5 WCF Transaction Propagation में:

class MyService : IMyContract 
{ 
    [OperationBehavior(TransactionScopeRequired = true)] 
    public void MyMethod(...) 
    { 
     Transaction transaction = Transaction.Current; 
     Debug.Assert(transaction.TransactionInformation. 
        DistributedIdentifier != Guid.Empty); 
    } 
} 

तो Transaction.Current.TransactionInformation.DistributedIdentifier खाली है, तो लेन-देन स्थानीय है और "प्रवाह" ऐसा नहीं किया। ध्यान दें कि TransactionFlowOptions.Allowed कॉन्फ़िगरेशन में यदि लेनदेन प्रवाह में विफल रहता है, तो यह चुपचाप विफल रहता है। तो यह वास्तव में जांचने का एकमात्र तरीका है ... और बहने से आप अपेक्षा से अधिक आसानी से नहीं होते हैं।

जब मैंने उत्पादन सेवा के लिए ट्रांज़ेक्शन का उपयोग किया तो मैंने वास्तव में TransactionFlowOptions.Allowed से परहेज किया क्योंकि कॉलर वास्तव में यह सुनिश्चित नहीं था कि लेनदेन वास्तव में बहता है या नहीं। यदि तैनाती में बाध्यकारी कॉन्फ़िगरेशन त्रुटि थी, तो सब ठीक हो जाएगा लेकिन रोलबैक विफल हो जाएंगे ... पता लगाने के लिए एक बहुत ही कठिन त्रुटि। तो मैंने जरूरी स्विच किया। फिर कॉलर यह सुनिश्चित कर सकता है कि उनके द्वारा प्रदत्त लेनदेन वास्तव में सफलतापूर्वक पारित किया गया था। (यदि लेनदेन TransactionFlowOptions.Required कॉन्फ़िगरेशन में नहीं बहता है तो आपको अपवाद मिलेगा।)

+0

बहुत बढ़िया। मैंने NetTCP बाध्यकारी प्रोग्रामेटिक रूप से बनाया था और बाध्यकारी सेट नहीं किया था। ट्रांज़ेक्शनफ्लो = सच - ऐसा करने के बाद यह सभी अपेक्षित काम करता है। बहुत बहुत धन्यवाद –

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

  • कोई संबंधित समस्या नहीं^_^