TransactionScope कैसे लेन-देन को वापस करता है?


100

मैं एक एकीकरण परीक्षण लिख रहा हूं जहां मैं एक डेटाबेस में कई ऑब्जेक्ट सम्मिलित करूंगा और फिर यह सुनिश्चित करने के लिए जांच करूंगा कि क्या मेरा तरीका उन वस्तुओं को पुनर्प्राप्त करता है।

डेटाबेस से मेरा संबंध NHibernate के माध्यम से है ... और इस तरह का परीक्षण बनाने की मेरी सामान्य विधि निम्नलिखित होगी:

NHibernateSession.BeginTransaction();

//use nhibernate to insert objects into database
//retrieve objects via my method
//verify actual objects returned are the same as those inserted

NHibernateSession.RollbackTransaction();

हालाँकि, मैंने हाल ही में TransactionScope के बारे में पता लगाया है, जिसे जाहिर तौर पर इस उद्देश्य के लिए इस्तेमाल किया जा सकता है ...

कुछ उदाहरण कोड मैंने पाया है जो इस प्रकार है:

public static int AddDepartmentWithEmployees(Department dept)
{

    int res = 0;

    DepartmentAdapter deptAdapter = new DepartmentAdapter();
    EmployeeAdapter empAdapter = new EmployeeAdapter();
    using (TransactionScope txScope = new TransactionScope())
    {

        res += deptAdapter.Insert(dept.DepartmentName);
        //Custom method made to return Department ID 
        //after inserting the department "Identity Column"
        dept.DepartmentID = deptAdapter.GetInsertReturnValue();
        foreach(Employee emp in dept.Employees)
        {

            emp.EmployeeDeptID = dept.DepartmentID;
            res += empAdapter.Insert(emp.EmployeeName, emp.EmployeeDeptID);

        }
        txScope.Complete();

    }
    return res;

}

मेरा मानना ​​है कि अगर मैं उस लाइन को शामिल नहीं txScope.Complete()करता जिसे डाला गया डेटा वापस रोल किया जाएगा। लेकिन दुर्भाग्य से मुझे समझ नहीं आता कि कैसे संभव है ... कैसे करता txScopeवस्तु का एक ट्रैक रखने deptAdapterऔर empAdapterवस्तुओं और डेटाबेस पर उन्हें लेन-देन।

मुझे ऐसा लग रहा है कि मुझे यहाँ थोड़ी सी जानकारी याद आ रही है ... क्या मैं अपने कोड का उपयोग करके अपने आस-पास BeginTransaction()और RollbackTransaction() कॉल को वास्तव में बदल सकता हूँ TransactionScope?

यदि नहीं, तो कैसे TransactionScopeवापस लेनदेन को रोल करने के लिए काम करता है ?


मैंने NHibernate का उपयोग कभी नहीं किया है, लेकिन शायद यह लिंक आपकी मदद करेगा।

यदि आप अपने NHibernate सत्र को लेनदेन में समूह संचालन के प्रबंधन के लिए बेहतर तरीके से देख रहे हैं, तो आप उस विषय पर अपने ब्लॉग पोस्ट की जांच करना चाह सकते हैं जैसे कि dotnetchris.wordpress.com/2009/01/27/…
क्रिस मैरिसिक

जवाबों:


108

अनिवार्य रूप से TransactionScope आपके एडेप्टर को ट्रैक नहीं करता है, यह क्या करता है यह डेटाबेस कनेक्शन को ट्रैक करता है। जब आप एक DB कनेक्शन खोलते हैं, तो कनेक्शन लगेगा कि क्या कोई परिवेश लेनदेन (लेनदेन स्कोप) है और यदि ऐसा है तो उसके साथ सूचीबद्ध करें। सावधानी यदि एक ही SQL सर्वर से एक से अधिक कनेक्शन हैं, तो यह एक डिस्ट्रिब्यूट किए गए लेनदेन में बढ़ जाएगा।

तब से क्या होता है जब आप एक प्रयोग करने वाले ब्लॉक का उपयोग कर रहे हैं जिसे आप यह सुनिश्चित कर रहे हैं कि यदि कोई अपवाद होता है, तो उसे निपटान कहा जाएगा। इसलिए यदि निपटान को txScope से पहले कहा जाता है। पूरा () TransactionScope अपने लेन-देन (या DTC) को रोलबैक करने के लिए कनेक्शन बताएगा।


10
TransactionScope कुछ भी ट्रैक नहीं करता है लेकिन थ्रेड पर वर्तमान लेन-देन, और इसे संशोधित करता है यदि इसे मॉडल पर आधारित होना चाहिए (आवश्यकता है, नए, आदि, आदि की आवश्यकता है)। लेन-देन बस कुछ भी सूचित करता है जो इसके साथ संलग्न करता है, न कि केवल डेटाबेस कनेक्शन।
कैस्पर ओने

1
मुझे लगता है कि यह पूरी तरह सच नहीं है। मैंने TransactionScope के स्रोत कोड का आंशिक पता लगाया और मैंने इस msdn.microsoft.com/en-us/library/ms172152(v=vs.90).aspx को भी देखा, जो कहता है कि "यदि यह लेन-देन नहीं बना, तो प्रतिबद्ध तब होता है जब भी कमिट करने योग्य वस्तु के स्वामी द्वारा कमेटी को बुलाया जाता है। उस बिंदु पर लेन-देन प्रबंधक संसाधन प्रबंधकों को कॉल करता है और उन्हें सूचित करता है कि क्या या तो कमिटमेंट या रोलबैक के आधार पर सूचित किया जाता है, क्या पूर्ण विधि TransactionScash ऑब्जेक्ट पर कॉल की गई थी। " स्रोत ट्रेस भी इस व्यवहार को इंगित करता है।
user44298

मुझे यह SO Q & A उपयोगी लगा: IEnlistmentNotification
mungflesh 16

फिर भी मेरे लिए अस्पष्ट। ऐसा लगता है कि लेन-देन के दायरे में आने वाली विधियों के साथ वस्तुओं को लेनदेन तंत्र के साथ सहकारी होना चाहिए। उन्हें सिस्टम द्वारा कमिट / रोलबैक नोटिफिकेशन की तलाश करनी चाहिए, और आवश्यकता पड़ने पर रोलबैक करने के लिए स्वयं को वापस करने में सक्षम होना चाहिए (यदि किसी फ़ाइल विलोपन को निष्पादित किया गया था, तो जाहिर है कि हम जादुई रूप से इसे वापस नहीं ले सकते जब तक कि हमने नहीं लिया। कुछ एहतियाती उपाय)। यह भी लगता है कि SQL सर्वर संचालन सहकारी हैं। लेकिन क्या .Net में कोई अन्य सहकारी वस्तु है? और एक वर्ग को कैसे लिखना है जो सहकारी है? प्रलेखन?
मिनट

54

TransactionScopeवर्ग के साथ काम करता Transactionवर्ग है, जो धागा-विशिष्ट है।

जब TransactionScopeबनाया जाता है, तो यह देखने के लिए जांचता है कि क्या Transactionथ्रेड के लिए है; यदि कोई मौजूद है तो वह इसका उपयोग करता है, अन्यथा, यह एक नया बनाता है और इसे स्टैक पर धकेलता है।

यदि यह किसी मौजूदा का उपयोग करता है, तो यह सिर्फ रिलीज के लिए एक काउंटर बढ़ाता है (क्योंकि आपको उस पर कॉल Disposeकरना होगा)। आखिरी रिलीज पर, अगर Transactionकॉमेडी नहीं की गई थी , तो यह सभी काम वापस कर देता है।

जैसे कि क्यों वर्गों को लेनदेन के बारे में जादुई रूप से पता है, कि उन वर्गों के लिए कार्यान्वयन विवरण के रूप में छोड़ दिया जाता है जो इस मॉडल के साथ काम करना चाहते हैं।

जब आप अपने deptAdapterऔर emptAdapterउदाहरण बनाते हैं , तो वे यह देखने के लिए जांचते हैं कि क्या थ्रेड ( क्लास पर स्थिर Currentसंपत्तिTransaction ) पर वर्तमान लेनदेन है या नहीं । यदि वहाँ है, तो यह Transactionप्रतिबद्ध / रोलबैक अनुक्रम में भाग लेने के लिए खुद को पंजीकृत करता है (जो Transactionनियंत्रित करता है, और अलग-अलग लेन-देन समन्वयक, जैसे कर्नेल, वितरित, आदि) के लिए प्रचार कर सकता है।


4
स्कोलकोनेक्शन (एस) के दायरे के भीतर कैसे काम करता है? SqlConnection वर्ग आंतरिक रूप से Transaction वर्ग का उपयोग करता है, जो TransactionScope के साथ-साथ जुड़ता है? या यह सीधे टीएलएस में सूचीबद्ध करता है?
काकिरा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.