यह बिल्कुल भी जटिल नहीं है।
-
सबसे पहले, आपको यह समझने की आवश्यकता है कि स्प्रिंग लेनदेन प्रबंधक केवल एक लेनदेन प्रबंधन अमूर्त है। आपके मामले में, वास्तविक लेनदेन JDBC कनेक्शन स्तर पर होता है।
-
सभी
@Transactional
सर्विस मेथड कॉल्स कोTransactionInterceptor
. द्वारा इंटरसेप्ट किया जाता है पहलू। -
TransactionIntreceptor
वर्तमान कॉन्फ़िगर किए गएAbstractPlatformTransactionManager
कार्यान्वयन (JpaTransactionManager
आपके मामले में)। -
JpaTransactionManager
वर्तमान चल रहे स्प्रिंग लेनदेन को एक EntityManager से जोड़ देगा, इसलिए वर्तमान लेनदेन में भाग लेने वाले सभी DAO समान दृढ़ता संदर्भ साझा करते हैं। -
JpaTransactionManager
बसEntityManager
. का उपयोग करता है लेनदेन को नियंत्रित करने के लिए लेनदेन एपीआई:EntityTransaction tx = txObject.getEntityManagerHolder().getEntityManager().getTransaction(); tx.commit();
जेपीए लेनदेन एपीआई केवल अंतर्निहित जेडीबीसी कनेक्शन प्रतिबद्ध/रोलबैक विधियों को कॉल का प्रतिनिधित्व करता है।
-
जब लेन-देन किया जाता है (प्रतिबद्ध/रोलबैक),
org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction
कॉल:transactionCoordinator().getTransactionContext().managedClose();
जो एक हाइबरनेट सत्र (इकाई प्रबंधक) को बंद कर देता है।
-
इसलिए अंतर्निहित JDBC कनेक्शन को भी बंद करने के लिए ट्रिगर किया गया है:
jdbcCoordinator.close();
-
हाइबरनेट में एक तार्किक JDBC कनेक्शन हैंडल है:
@Override public Connection close() { LOG.tracev( "Closing JDBC container [{0}]", this ); if ( currentBatch != null ) { LOG.closingUnreleasedBatch(); currentBatch.release(); } cleanup(); return logicalConnection.close(); }
-
लॉजिकल कनेक्शन वर्तमान में कॉन्फ़िगर किए गए कनेक्शन प्रदाता (
DataSourceConnectionProvider
. को करीबी कॉल का प्रतिनिधित्व करता है आपके मामले में), जो केवल JDBC कनेक्शन पर क्लोज मेथड को कॉल करता है:@Override public void closeConnection(Connection connection) throws SQLException { connection.close(); }
-
किसी भी अन्य कनेक्शन पूलिंग डेटासोर्स की तरह, JDBC कनेक्शन क्लोज केवल पूल से कनेक्शन लौटाता है और भौतिक डेटाबेस कनेक्शन को बंद नहीं करता है। ऐसा इसलिए है क्योंकि कनेक्शन पूलिंग डेटासोर्स एक JDBC कनेक्शन प्रॉक्सी देता है जो सभी कॉलों को इंटरसेप्ट करता है और कनेक्शन पूल हैंडलिंग लॉजिक के समापन को दर्शाता है।
ध्यान दें कि RESOURCE_LOCAL लेनदेन के लिए, आपको hibernate.connection.provider_disables_autocommit
संपत्ति अगर autocommit
कनेक्शन पूल द्वारा चेक अक्षम कर दिया गया था। इस तरह, SQL क्वेरी निष्पादित करने या Persistence Context को फ़्लश करने से पहले डेटाबेस कनेक्शन आलसी रूप से प्राप्त किए जाने वाले हैं।