2009-06-30 13 views
6

मैं एकाधिक डेटाबेस पर डेटा परिवर्तन कर रहा हूं, और मैं एक लेनदेन को कार्यान्वित करना चाहता हूं जिसमें सभी परिवर्तन शामिल होंगे।एकाधिक डेटाबेस पर लेनदेन कार्यान्वित करना

try 
{ 
    db[1].begintransaction(); 
    db[1].ExecuteNonQuery(); 

    db[2].begintransaction(); 
    db[2].ExecuteNonQuery(); 

    ... 

    db[N].begintransaction(); 
    db[N].ExecuteNonQuery(); 

    // will execute only if no exception raised during the process 
    for (int a = 0; a < N; a++) 
    { 
     db[a].Commit();// what if there is an error/exception here 
    } 
} 
catch 
{ 
    for (int a = 0; a < N; a++) 
    { 
     db[a].RollBack(); 
    } 
} 

समस्या यह है कि इसके बाद के संस्करण बुरी तरह विफल हो जाएगा एक अपवाद (टिप्पणी देखें) एक Commit() दौरान होता है अगर:

यह मैं वर्तमान में क्या है। क्या इसे पूरा करने का कोई बेहतर तरीका है?

+0

नोट: यह वास्तविक कोड नहीं है। ive ने स्पष्टता के लिए इसे महत्वपूर्ण रूप से संशोधित किया –

+0

अरे मुझे एक ही समस्या है ... और मेरे डेटाबेस या तो माइस्क्ल और एसक्यूएल सर्वर हो सकते हैं ... क्या यह लेनदेनस्कोप के साथ काम करेगा? –

उत्तर

12

इस तरह TransactionScope वर्ग का उपयोग करें:

using (TransactionScope ts = new TransactionScope()) 
{ 
    //all db code here 

    // if an error occurs jump out of the using block and it will dispose and rollback 

    ts.Complete(); 
} 

TransactionScope वर्ग स्वचालित रूप से एक वितरित लेन-देन करने के लिए परिवर्तित कर देंगे, यदि आवश्यक हो।

+0

@ जेसे, मुझे लगता है कि डेटाबेस में लेनदेन के लिए, नेट के नवीनतम संस्करण में भी, माइक्रोसॉफ्ट वितरित लेनदेन समन्वयक की आवश्यकता होगी। मैं नहीं मिला कि आपने क्यों कहा कि इसकी आवश्यकता नहीं होगी? – Sunil

+0

@ सुनील आप बिल्कुल सही हैं। उस समय .NET Framework के मेरे हिस्से पर यह एक गलतफहमी थी। मैं गलत टिप्पणी को हटाने के लिए आगे बढ़ जाऊंगा। मुझे सूचित करने के लिए धन्यवाद! =) – Jesse

0

चूंकि क्लेटस ने कहा, आपको किसी प्रकार की two-phase commit की आवश्यकता है। जैसा कि लेख बताता है, यह हमेशा अभ्यास में काम नहीं करता है। यदि आपको एक मजबूत समाधान की आवश्यकता है, तो आपको लेन-देन को इस तरह से क्रमबद्ध करने का एक तरीका मिलना चाहिए कि आप उन्हें एक दूसरे के बाद कर सकते हैं और उन्हें व्यक्तिगत रूप से वापस रोल कर सकते हैं।

चूंकि यह उस विशिष्ट मामले पर निर्भर करता है जिस पर आप कोई विवरण नहीं देते हैं, मैं आपको विचार नहीं कर सकता कि इस पर हमला कैसे करें।

1

का उपयोग TransactionScope जवाब है पर एक नज़र डालें। यह विभिन्न डीबीएमएस के साथ भी काम करता है !!!

Transactions over multiple databases

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