लेन-देन की आवश्यकता क्यों है

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

उदाहरण के लिए, हम बैंकिंग सॉफ्टवेयर लिख रहे हैं जो तीन काम करेगा:

  • ग्राहक के खाते से पैसे निकाले
  • प्राप्तकर्ता के खाते में पैसे जोड़ें
  • पोस्टिंग डेटा को "पोस्टिंग लॉग" में रिकॉर्ड करें

यदि इनमें से किसी भी क्रिया के निष्पादन के दौरान कोई त्रुटि होती है, तो अन्य दो को भी रद्द कर देना चाहिए। ग्राहक से पैसे लिखना और प्राप्तकर्ता को नहीं जोड़ना असंभव है? ठीक है, या प्राप्तकर्ता को जोड़ें, लेकिन ग्राहक से नहीं लिखें?

तो, एक में विभिन्न क्रियाओं के ऐसे तार्किक समूहन को लेन-देन कहा जाता है । दूसरे शब्दों में, लेन-देन क्रियाओं का एक समूह है जिसे केवल एक साथ किया जाना चाहिए । यदि कोई क्रिया विफल हुई या किसी त्रुटि के साथ निष्पादित हुई, तो अन्य सभी क्रियाएं रद्द कर दी जानी चाहिए।

एक लेन-देन में आमतौर पर तीन अवस्थाएँ होती हैं:

  • प्रारंभिक अवस्था - क्रियाओं के समूह को निष्पादित करने से पहले सिस्टम की स्थिति
  • सक्सेस स्टेट - एक्शन ग्रुप पूरा होने के बाद की स्थिति
  • विफल स्थिति - कुछ गलत हो गया

इस मामले में, आमतौर पर तीन आदेश होते हैं:

  • start/start - कार्यों के तार्किक समूह की शुरुआत से पहले निष्पादित
  • प्रतिबद्ध - लेन-देन कार्रवाई समूह के बाद निष्पादित
  • रोलबैक - सिस्टम को विफल स्थिति से प्रारंभिक अवस्था में वापस करने की प्रक्रिया शुरू करता है

यह इस तरह काम करता है।

पहले आपको लेन-देन खोलने की आवश्यकता है - start() या start() विधि को कॉल करें । इस पद्धति को कॉल करना सिस्टम की उस स्थिति को इंगित करता है जिसमें हम कुछ गलत होने पर वापस लौटने का प्रयास करेंगे।

फिर सभी क्रियाएं की जाती हैं, जो एक तार्किक समूह - लेनदेन में संयुक्त होती हैं।

फिर प्रतिबद्ध () विधि कहा जाता है । इसकी कॉल क्रियाओं के एक तार्किक समूह के अंत को चिह्नित करती है, और आमतौर पर इन क्रियाओं को व्यवहार में लाने की प्रक्रिया भी शुरू करती है।

याद करें कि हमने FileWriter में कुछ कैसे लिखा है: सबसे पहले, हमने जो कुछ लिखा है वह मेमोरी में संग्रहीत है, और फिर जब फ्लश () विधि कहा जाता है , तो मेमोरी में बफर से सभी डेटा डिस्क पर लिखे जाते हैं। यह फ्लश () ट्रांजेक्शन कमिट है।

ठीक है, अगर लेन-देन के संचालन के दौरान कोई त्रुटि हुई, तो आपको प्रारंभिक स्थिति में लौटने की प्रक्रिया शुरू करने की आवश्यकता है। इस प्रक्रिया को रोलबैक () कहा जाता है , और उसी नाम की विधि आमतौर पर इसके लिए जिम्मेदार होती है।

मोटे तौर पर, लेन-देन पूरा करने के 2 तरीके हैं:

  • COMMIT - हम किए गए सभी परिवर्तनों की पुष्टि करते हैं
  • रोलबैक - किए गए सभी परिवर्तनों को वापस ले लें

JDBC में लेन-देन

लगभग हर DBMS लेनदेन के साथ काम कर सकता है। इसलिए JDBC को भी इस केस का समर्थन है। सब कुछ बहुत सरलता से कार्यान्वित किया जाता है।

सबसे पहले, स्टेटमेंट ऑब्जेक्ट के एक्ज़ीक्यूट () विधि के लिए प्रत्येक कॉल को एक अलग लेनदेन में निष्पादित किया जाता है। ऐसा करने के लिए, कनेक्शन में AutoCommit पैरामीटर है । यदि यह सत्य पर सेट है , तो प्रत्येक कॉल के बाद निष्पादन () विधि के लिए प्रतिबद्ध () कहा जाएगा ।

दूसरे, यदि आप एक लेन-देन में कई कमांड निष्पादित करना चाहते हैं, तो आप इसे इस तरह कर सकते हैं:

  • AutoCommit को अक्षम करें
  • हमारे आदेशों को कॉल करना
  • प्रतिबद्ध() विधि को स्पष्ट रूप से कॉल करें

यह बहुत ही सरल दिखता है:

connection.setAutoCommit(false);

Statement statement = connection.createStatement();
int rowsCount1 = statement.executeUpdate("UPDATE  employee SET salary = salary+1000");
int rowsCount2 = statement.executeUpdate("UPDATE  employee SET salary = salary+1000");
int rowsCount3 = statement.executeUpdate("UPDATE  employee SET salary = salary+1000");

connection.commit();

यदि कमिट () विधि के चलने के दौरान सर्वर पर कोई त्रुटि होती है , तो SQL सर्वर तीनों क्रियाओं को रद्द कर देगा।

लेकिन ऐसी स्थितियाँ होती हैं जब क्लाइंट की ओर से त्रुटि अभी भी होती है, और हमें कभी भी कमिट () विधि कॉल नहीं मिली :

connection.setAutoCommit(false);

Statement statement = connection.createStatement();
int rowsCount1 = statement.executeUpdate("UPDATE  employee SET salary = salary+1000");
int rowsCount2 = statement.executeUpdate("UPDATE  employee SET salary = salary+1000");
int rowsCount3 = statement.executeUpdate("UPDATE multiple typos will result in an exception");

connection.commit();

यदि एक एक्जीक्यूटअपडेट () के निष्पादन के दौरान कोई त्रुटि होती है , तो कमिट () विधि को नहीं कहा जाएगा। किए गए सभी कार्यों को वापस करने के लिए, आपको रोलबैक () विधि को कॉल करने की आवश्यकता है । यह आमतौर पर ऐसा दिखता है:

try{
  	connection.setAutoCommit(false);

  	Statement statement = connection.createStatement();
  	int rowsCount1 = statement.executeUpdate("UPDATE  employee SET salary = salary+1000");
  	int rowsCount2 = statement.executeUpdate("UPDATE  employee SET salary = salary+1000");
  	int rowsCount3 = statement.executeUpdate("UPDATE multiple typos will result in an exception");

	  connection.commit();
 }
 catch (Exception e) {
   connection.rollback();
}

अंक बचाओ

JDBC 3.0 के आगमन के साथ, लेन-देन रोलबैक के साथ और अधिक कुशलता से काम करना संभव हो गया। अब आप सेव पॉइंट - सेव पॉइंट सेट कर सकते हैं, और जब आप रोलबैक () ऑपरेशन कहते हैं , तो एक विशिष्ट सेव पॉइंट पर वापस रोल करें।

बचाने के लिए, आपको एक सेवपॉइंट बनाने की जरूरत है, यह कमांड के साथ किया जाता है:

Savepoint save = connection.setSavepoint();

सेवपॉइंट पर वापस जाना कमांड के साथ किया जाता है:

connection.rollback(save);

आइए हमारे समस्याग्रस्त कमांड से पहले एक सेवपॉइंट जोड़ने का प्रयास करें:

try{
  	connection.setAutoCommit(false);

  	Statement statement = connection.createStatement();
  	int rowsCount1 = statement.executeUpdate("UPDATE  employee SET salary = salary+1000");
  	int rowsCount2 = statement.executeUpdate("UPDATE  employee SET salary = salary+1000");

  	Savepoint save = connection.setSavepoint();
 	 try{
      	int rowsCount3 = statement.executeUpdate("UPDATE multiple typos will result in an exception");
 	 }
 	 catch (Exception e) {
    	   connection.rollback(save);
 	 }

	  connection.commit();
 }
 catch (Exception e) {
   connection.rollback();
}

हमने समस्याग्रस्त विधि को कॉल करने से पहले एक सेव-पॉइंट जोड़कर और रोलबैक (सेव) विधि को कॉल करके सहेजी गई स्थिति में वापस आकर नेस्टेड लेनदेन का आयोजन किया ।

हां, यह गेम्स में सेव/लोड करने के समान ही है।