मैंने कोर सेवा का उपयोग कर प्रकाशन लक्ष्य में गंतव्य हटाने के लिए & जोड़ने में सहायता के लिए एक कक्षा लिखी। गंतव्यों को सामान्य रूप से कोर सेवा के माध्यम से एक स्ट्रिंग (एक्सएमएल सामग्री के साथ) के रूप में उजागर किया जाता है, इसलिए मैंने इसके आसपास अपने स्वयं के रैपर लिखा, आदिमैं 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);
}
लेकिन यह एक फर्क नहीं किया। क्या यह निर्धारित करने का कोई तरीका है कि क्या मैं वर्तमान में लेनदेन में हूं और किसी भी तरह से लेनदेन का उपयोग करता हूं? मैं एक लेनदेन की आवश्यकता नहीं चाहता, सिर्फ एक में काम करने का विकल्प चाहते हैं।
धन्यवाद, और बहुत लंबी पोस्ट के लिए खेद है ... यह सुनिश्चित करना चाहता था कि मैंने जितना संभव हो उतना जानकारी प्रदान की हो।
चूंकि आपके पास 'उपयोग' खंड में 'स्कोप' चर है, इसलिए आपको स्पष्ट रूप से 'निपटान' को कॉल नहीं करना चाहिए। इसके बजाय 'उपयोग' ब्लॉक समाप्त होने पर इसे स्वचालित रूप से निपटाया जाएगा। –
आप कहते हैं "मैं इसे डुबो नहीं सकता"। इसका क्या मतलब है? क्या आपको एक कंपाइलर त्रुटि मिलती है? एक अपवाद? या कोड सिर्फ आपके लक्ष्यों को अपडेट नहीं करता है? (पीएस: यदि डब्ल्यूसीएफ लेनदेन का नाम मेरे द्वारा उपयोग किए जाने वाले अनुसार किया जाता है, तो एक लेनदेन स्कोप या तो मौजूदा लेनदेन पर "पिग्गी बैक" या एक नया शुरू करेगा। लेकिन चूंकि मुझे डब्ल्यूसीएफ लेनदेन के साथ कोई अनुभव नहीं है, इसलिए मैं ज्यादा चाहता हूं किसी और को उस धारणा की पुष्टि/सही देखें)। –
हे फ्रैंक, मैं इसे असफल बनाने की कोशिश कर रहा हूं, इसलिए मेरा दायरा। (कॉल करें) कॉल करें। पहले उदाहरण में यह सही ढंग से विफल रहता है, और दूसरे पर यह नहीं करता है। यह समझने की कोशिश कर रहा हूं कि इसे मेरी कक्षा में जोड़ने के लिए मुझे क्या करना है ... –