लेनदेन

SQL & Hibernate
स्तर 16 , सबक 3
उपलब्ध

4.1 हाइबरनेट में लेन-देन का परिचय

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

हाइबरनेट दो प्रकार के लेन-देन के साथ काम करने में सक्षम है:

  • जेडीबीसी
  • जेटीए

एक JDBC लेन-देन वास्तव में एक डेटाबेस लेन-देन है। यह JDBC कनेक्शन के लिए डेटाबेस के साथ काम करने से जुड़ा हुआ है। और वह यह सुनिश्चित करता है कि डेटाबेस के साथ काम करते समय क्रियाएं उसी तरह से की जाती हैं जैसे उन्हें करना चाहिए: या तो सभी या कुछ भी नहीं।

जेटीए - लेन-देन एक आवेदन स्तर का लेनदेन है। यह किसी डेटाबेस से बंधा नहीं है। इसका कार्य यह सुनिश्चित करना है कि कुछ क्रियाएं की जाती हैं: या तो सभी या कुछ भी नहीं।

उदाहरण के लिए, आप एक JTA लेनदेन में कई अलग-अलग डेटाबेस में डेटा लिख ​​सकते हैं। फिर यदि कोई त्रुटि होती है, तो JTA लेनदेन को सभी डेटाबेस में परिवर्तन वापस करना होगा। यहां तक ​​कि वे भी जिन्हें किसी विशेष डेटाबेस के संदर्भ में सफलतापूर्वक निष्पादित किया गया था।

4.2 हाइबरनेट लेनदेन इंटरफ़ेस

हाइबरनेट लाइब्रेरी में, लेन-देन इंटरफ़ेस द्वारा एक लेन-देन का प्रतिनिधित्व किया जाता है, जिसमें अलग-अलग कार्यान्वयन हो सकते हैं। उदाहरण के लिए, स्प्रिंग के साथ काम करते समय, स्प्रिंग अपना स्वयं का JTA लेनदेन तंत्र प्रदान करता है।

इस इंटरफ़ेस के तरीके हैं:

# तरीका विवरण
1 शुरू करना() एक नया लेन-देन शुरू करता है
2 वादा करना() लेन-देन समाप्त करता है, सभी परिवर्तनों को धकेलता/प्रतिबद्ध करता है
3 रोलबैक () वर्तमान लेनदेन को वापस रोल करता है
4 सेटटाइमआउट (इंट सेकंड) अधिकतम लेनदेन निष्पादन समय निर्धारित करता है
5 सक्रिय है() जाँचता है कि कोई लेन-देन सक्रिय है या नहीं
6 रोल्डबैक () था जांचता है कि लेनदेन सामान्य रूप से वापस लुढ़का है या नहीं
7 प्रतिबद्धता थी() जाँचता है कि क्या लेन-देन सामान्य रूप से प्रतिबद्ध है
8 रजिस्टर तुल्यकालन () लेन-देन को नियंत्रित करने के लिए कॉलबैक पंजीकृत करता है

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

आमतौर पर हाइबरनेट में लेन-देन को कैसे नियंत्रित किया जाता है, इसका एक उदाहरण:


Session session = sessionFactory.openSession();
Transaction transaction = session.getTransaction();
try {
    transaction.begin();
    Long count = session.createQuery("select count(*) from Employee", Long.class).uniqueResult();
    transaction.commit();
}
catch (Exception e) {
	if (transaction.getStatus() == ACTIVE || transaction.getStatus() == MARKED_ROLLBACK) {
    transaction.rollback();
    }
}
finally {
	session.close();
	sessionFactory.close();
}

हम यहां तीन चीजें देखते हैं:

सबसे पहले, डेटाबेस के साथ सभी कार्य विधियों को कॉल करके लेनदेन में लपेटे जाते हैं begin()और commit()इन दो विधियों के कॉल के बीच सभी क्रियाएं की जानी चाहिए: या तो सभी एक साथ, या कुछ भी नहीं।

दूसरे, यदि कोई त्रुटि होती है, तो हम लेन-देन को रोलबैक करने का प्रयास करते हैं - rollback(). इसका अर्थ है कि TransactionManger को पहले उन सभी कार्रवाइयों को रिकॉर्ड करना चाहिए जो begin()और के बीच थीं commit(), और फिर सब कुछ वैसा ही लौटाएं जैसा कि हम कॉल करते थे rollback()

और वैसे, यह एक तथ्य नहीं है कि रोलबैक पद्धति को कॉल करते समय कोई त्रुटि नहीं होगी। गलतियाँ हमेशा होती हैं। आपको बस इस तथ्य को स्वीकार करने और इसके लिए तैयार रहने की जरूरत है।

4.3 लेन-देन प्रबंधक

लेन-देन प्रबंधन के नजरिए से, हाइबरनेट JDBC के लिए सिर्फ एक हल्का ऑब्जेक्ट रैपर है। हाइबरनेट में लेन-देन प्रसंस्करण सुविधाएँ नहीं हैं। हाइबरनेट लेनदेन वास्तव में अंतर्निहित JDBC लेनदेन (या JTA लेनदेन आवरण) के लिए एक आवरण है। JDBCTransaction डिफ़ॉल्ट है। हाइबरेंटे सेटिंग फ़ाइल से उदाहरण:


hibernate.transaction.factory_class  org.hibernate.transaction.JTATransactionFactory
hibernate.transaction.factory_class  org.hibernate.transaction.JDBCTransactionFactory

लेन-देन का उपयोग करके हमारे कोड पर एक और नज़र डालते हैं:


Session session = sessionFactory.openSession();
Transaction transaction = session.getTransaction();
transaction.begin();
//here is your code for working with the base
session.flush();
transaction.commit();
session.close();

अब आइए JDBCTransaction क्लास कोड देखें:


public class JDBCTransaction implements Transaction {
 
    public void begin() throws HibernateException {
    	...
    	if (toggleAutoCommit) jdbcContext.connection().setAutoCommit(false);
    	...
    }
}

लेन-देन शुरू करने का यह तरीका है। फिर भेजें विधि देखें:


public void commit() throws HibernateException {
    ...
    jdbcContext.connection().commit();
    ...
    jdbcContext.connection().setAutoCommit( true );
    ...
}

अब इस कोड को हाइबरनेट उदाहरण कोड में बदलें:

हाइबरनेट सरल JDBC कोड

Session session = sessionFactory.openSession();
Transaction transaction = session.getTransaction();
transaction.begin();
//here is your code for working with the database
session.flush();
transaction.commit();
session.close();

Connection conn = jdbcContext.connection();
conn.setAutoCommit(false);
 
//here is your database code
conn.commit ()
conn.setAutoCommit(true);
conn.close();

तो देशी हाइबरनेट लेनदेन डेटाबेस के लिए सिर्फ देशी JDBC कॉल हैं। न कम न ज़्यादा। लेकिन जेटीए लेनदेन अधिक दिलचस्प हैं। लेकिन उस बारे में फिर कभी।

टिप्पणियां
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION