2012-06-18 15 views
5

वसंत प्रोग्रामेटिक लेनदेन का समर्थन करता है जो हमें TX प्रबंधन पर बढ़िया दाग नियंत्रण प्रदान करता है। वसंत के TransactionTemplate उपयोग
1.:: स्प्रिंग प्रलेखन के अनुसार, एक द्वारा कार्यक्रम संबंधी TX प्रबंधन का उपयोग कर सकतेवसंत प्रोग्रामेटिक लेनदेन प्रबंधन चेतावनी?

transactionTemplate.execute(new TransactionCallbackWithoutResult() { 

protected void doInTransactionWithoutResult(TransactionStatus status) { 
    try { 
     updateOperation1(); 
     updateOperation2(); 
    } catch (SomeBusinessExeption ex) { 
     status.setRollbackOnly(); 
    } 
} }); 

2. सीधे PlatformTransactionManager लाभ (डीएओ में एक PlatformTransactionManager कार्यान्वयन इंजेक्षन):

DefaultTransactionDefinition def = new DefaultTransactionDefinition(); 
def.setName("SomeTxName"); 
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); 

//txManager is a reference to PlatformTransactionManager 
TransactionStatus status = txManager.getTransaction(def); 
try { 
    updateOperation1(); 
    updateOperation2(); 
} 
catch (MyException ex) { 
    txManager.rollback(status); 
    throw ex; 
} 
txManager.commit(status); 

के लिए सरलीकरण की खातिर, मान लीजिए कि हम जेडीबीसी डेटाबेस ऑपरेशन से निपट रहे हैं।

मैं के लिए किसी भी डेटाबेस कार्यों दूसरा टुकड़ा में updateOperation1(),updateOperation2() में हुआ सोच रहा हूँ, या तो यह, JDBCTemplate या JDBCDaoSupport साथ लागू किया गया है, अगर नहीं, आपरेशन वास्तव में किसी भी लेन-देन के भीतर नहीं किया जाता है, यह क्या है?

मेरा विश्लेषण यह है कि यदि हम JDBCTemplate या JDBCDaoSupport का उपयोग नहीं करते हैं, तो हम अनिवार्य रूप से डेटास्र प्रबंधन से कनेक्शन बनायेंगे/पुनर्प्राप्त करेंगे। हम जो कनेक्शन प्राप्त करते हैं वह निश्चित रूप से लेनदेन का प्रबंधन करने के लिए अंतर्निहित कनेक्शन PlatformTransactionManager द्वारा उपयोग नहीं किया जाता है।

मैंने वसंत स्रोत कोड खोला और स्कीम संबंधित वर्ग को पाया कि PlatformTransactionManagerConnectionHolder में निहित कनेक्शन पुनर्प्राप्त करने का प्रयास करेगा जो बदले में TransactionSynchronizationManager से पुनर्प्राप्त किया गया था। मैंने यह भी पाया JDBCTemplate और JDBCDaoSupport, भी से TransactionSynchronizationManager.

क्योंकि TransactionSynchronizationManager धागा प्रति कनेक्शन सहित कई संसाधन प्रबंधन करता है इसी तरह की दिनचर्या के सिलसिले प्राप्त करने की कोशिश (मूल रूप से Threadlocal का उपयोग एक धागा कामयाब संसाधन की अपनी अनूठी उदाहरण मिल सुनिश्चित करने के लिए)

तो मुझे लगता है कि प्लेटफ़ॉर्म ट्रान्सक्शन मैनेजर और JDBCTemplate या JDBCDaoSupport द्वारा पुनर्प्राप्त कनेक्शन समान है, यह समझा सकता है कि कैसे वसंत प्रोग्रामैटिक लेनदेन सुनिश्चित करता है कि updateOperation1(),updateOperation2() लेनदेन द्वारा संरक्षित किया गया था।

क्या मेरा विश्लेषण सही है? यदि ऐसा है, तो वसंत दस्तावेज ने इस चेतावनी पर जोर क्यों नहीं दिया है?

उत्तर

2

हाँ, यह सही है।

का उपयोग करता है कच्चे Connection आदेश स्प्रिंग द्वारा प्रबंधित लेनदेन में भाग लेने के (12.3.8 DataSourceTransactionManager) में विशेष तरीके से DataSource से उन्हें प्राप्त करना चाहिए किसी भी कोड:

आवेदन कोड DataSourceUtils के माध्यम से JDBC कनेक्शन को पुनः प्राप्त करने के लिए आवश्यक है जावा ईई के मानक DataSource.getConnection के बजाय .getConnection (डेटासोर्स)।

एक अन्य विकल्प (आप कोड है कि getConnection() कॉल नहीं बदल सकते हैं) TransactionAwareDataSourceProxy के साथ अपने DataSource रैप करने के लिए है।

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