वसंत - लेनदेन प्रबंधन
एक डेटाबेस लेन-देन क्रियाओं का एक क्रम है जो एक एकल इकाई के रूप में माना जाता है। इन क्रियाओं को या तो पूरी तरह से पूरा करना चाहिए या कोई भी प्रभाव नहीं लेना चाहिए। लेनदेन प्रबंधन डेटा अखंडता और स्थिरता सुनिश्चित करने के लिए RDBMS- उन्मुख उद्यम आवेदन का एक महत्वपूर्ण हिस्सा है। लेनदेन की अवधारणा को निम्नलिखित चार प्रमुख गुणों के साथ वर्णित किया जा सकता हैACID -
Atomicity - एक लेनदेन को ऑपरेशन की एकल इकाई के रूप में माना जाना चाहिए, जिसका अर्थ है कि या तो संचालन का पूरा अनुक्रम सफल या असफल है।
Consistency - यह डेटाबेस की संदर्भात्मक अखंडता, तालिकाओं में अद्वितीय प्राथमिक कुंजियों, आदि की स्थिरता का प्रतिनिधित्व करता है।
Isolation- एक ही समय में एक ही डेटा सेट के साथ कई लेनदेन प्रसंस्करण हो सकते हैं। प्रत्येक लेनदेन को डेटा भ्रष्टाचार को रोकने के लिए दूसरों से अलग किया जाना चाहिए।
Durability - एक बार जब कोई लेन-देन पूरा हो जाता है, तो इस लेनदेन के परिणामों को स्थायी किया जाना चाहिए और सिस्टम की विफलता के कारण डेटाबेस से मिटाया नहीं जा सकता है।
एक वास्तविक RDBMS डेटाबेस सिस्टम प्रत्येक लेनदेन के लिए सभी चार गुणों की गारंटी देगा। SQL का उपयोग कर डेटाबेस को जारी किए गए लेनदेन का सरलीकृत दृश्य इस प्रकार है -
ट्रांजेक्शन कमांड का उपयोग करके लेनदेन शुरू करें ।
SQL क्वेरी का उपयोग करके विभिन्न हटाए गए, अपडेट या सम्मिलित ऑपरेशन करें।
यदि सभी ऑपरेशन सफल होते हैं तो कमिट करें अन्यथा सभी ऑपरेशन रोलबैक करें।
स्प्रिंग फ्रेमवर्क विभिन्न अंतर्निहित लेनदेन प्रबंधन एपीआई के शीर्ष पर एक सार परत प्रदान करता है। स्प्रिंग के लेन-देन समर्थन का उद्देश्य POJOs में लेनदेन क्षमताओं को जोड़कर EJB लेनदेन का एक विकल्प प्रदान करना है। स्प्रिंग प्रोग्रामेटिक और डिक्लेक्टिव ट्रांजैक्शन मैनेजमेंट दोनों का समर्थन करता है। EJBs को एक एप्लिकेशन सर्वर की आवश्यकता होती है, लेकिन स्प्रिंग लेनदेन प्रबंधन को एप्लिकेशन सर्वर की आवश्यकता के बिना लागू किया जा सकता है।
स्थानीय बनाम वैश्विक लेनदेन
स्थानीय लेनदेन JDBC कनेक्शन जैसे एकल लेन-देन संसाधन के लिए विशिष्ट होते हैं, जबकि वैश्विक लेनदेन एक वितरित प्रणाली में लेन-देन जैसे कई लेन-देन संसाधनों को प्राप्त कर सकते हैं।
स्थानीय लेनदेन प्रबंधन एक केंद्रीकृत कंप्यूटिंग वातावरण में उपयोगी हो सकता है जहां आवेदन घटक और संसाधन एक ही स्थान पर स्थित होते हैं, और लेनदेन प्रबंधन में केवल एक मशीन पर चलने वाला स्थानीय डेटा प्रबंधक शामिल होता है। स्थानीय लेनदेन को लागू करना आसान है।
एक वितरित कंप्यूटिंग वातावरण में वैश्विक लेनदेन प्रबंधन की आवश्यकता होती है जहां सभी संसाधनों को कई प्रणालियों में वितरित किया जाता है। ऐसे मामले में, लेनदेन प्रबंधन स्थानीय और वैश्विक दोनों स्तरों पर किया जाना चाहिए। एक वितरित या एक वैश्विक लेनदेन को कई प्रणालियों में निष्पादित किया जाता है, और इसके निष्पादन के लिए वैश्विक लेनदेन प्रबंधन प्रणाली और सभी शामिल प्रणालियों के सभी स्थानीय डेटा प्रबंधकों के बीच समन्वय की आवश्यकता होती है।
प्रोग्रामेटिक बनाम डिक्लेरेटिव
स्प्रिंग दो प्रकार के लेनदेन प्रबंधन का समर्थन करता है -
प्रोग्राममैटिक ट्रांजैक्शन मैनेजमेंट - इसका मतलब है कि आपको प्रोग्रामिंग की मदद से ट्रांजैक्शन को मैनेज करना है। यह आपको अत्यधिक लचीलापन देता है, लेकिन इसे बनाए रखना मुश्किल है।
डिक्लेरेटिव ट्रांजैक्शन मैनेजमेंट - इसका मतलब है कि आप बिजनेस कोड से ट्रांजैक्शन मैनेजमेंट अलग कर सकते हैं। आप लेनदेन का प्रबंधन करने के लिए केवल एनोटेशन या XML- आधारित कॉन्फ़िगरेशन का उपयोग करते हैं।
डिक्लेरेटिव ट्रांजैक्शन मैनेजमेंट प्रोग्रामेटिक ट्रांजैक्शन मैनेजमेंट पर बेहतर होता है, हालांकि यह प्रोग्रामेटिक ट्रांजैक्शन मैनेजमेंट की तुलना में कम लचीला होता है, जो आपको अपने कोड के माध्यम से लेनदेन को नियंत्रित करने की अनुमति देता है। लेकिन एक प्रकार के क्रॉसकिटिंग चिंता के रूप में, घोषणात्मक लेनदेन प्रबंधन को एओपी दृष्टिकोण के साथ संशोधित किया जा सकता है। स्प्रिंग एओपी ढांचे के माध्यम से घोषणात्मक लेनदेन प्रबंधन का समर्थन करता है।
स्प्रिंग लेन-देन का सार
स्प्रिंग लेनदेन अमूर्त की कुंजी को org.springframework.transaction.PlatformTransactionManager इंटरफ़ेस द्वारा परिभाषित किया गया है, जो इस प्रकार है -
public interface PlatformTransactionManager {
TransactionStatus getTransaction(TransactionDefinition definition);
throws TransactionException;
void commit(TransactionStatus status) throws TransactionException;
void rollback(TransactionStatus status) throws TransactionException;
}
अनु क्रमांक | विधि और विवरण |
---|---|
1 | TransactionStatus getTransaction(TransactionDefinition definition) यह विधि निर्दिष्ट प्रचार व्यवहार के अनुसार वर्तमान में सक्रिय लेनदेन लौटाती है या एक नया बनाती है। |
2 | void commit(TransactionStatus status) यह पद्धति दी गई लेन-देन को उसकी स्थिति के संबंध में बताती है। |
3 | void rollback(TransactionStatus status) यह विधि दिए गए लेन-देन का रोलबैक करती है। |
TransactionDefinition वसंत में लेन-देन समर्थन के मूल स्वरूप है और इस प्रकार यह परिभाषित किया गया है -
public interface TransactionDefinition {
int getPropagationBehavior();
int getIsolationLevel();
String getName();
int getTimeout();
boolean isReadOnly();
}
अनु क्रमांक | विधि और विवरण |
---|---|
1 | int getPropagationBehavior() यह विधि प्रचार व्यवहार लौटाती है। स्प्रिंग ईजेबी सीएमटी से परिचित सभी लेनदेन प्रचार विकल्प प्रदान करता है। |
2 | int getIsolationLevel() यह विधि उस डिग्री को लौटाती है जिससे यह लेनदेन अन्य लेनदेन के काम से अलग हो जाता है। |
3 | String getName() यह विधि इस लेनदेन का नाम लौटाती है। |
4 | int getTimeout() यह विधि सेकंड में उस समय को वापस करती है जिसमें लेनदेन पूरा होना चाहिए। |
5 | boolean isReadOnly() यह विधि लौटाती है कि क्या लेन-देन केवल पढ़ने के लिए है। |
अलगाव स्तर के लिए संभावित मूल्य निम्नलिखित हैं -
अनु क्रमांक | अलगाव और विवरण |
---|---|
1 | TransactionDefinition.ISOLATION_DEFAULT यह डिफ़ॉल्ट आइसोलेशन स्तर है। |
2 | TransactionDefinition.ISOLATION_READ_COMMITTED इंगित करता है कि गंदे रीड को रोका जाता है; गैर-दोहराने योग्य रीड और प्रेत रीडिंग हो सकती हैं। |
3 | TransactionDefinition.ISOLATION_READ_UNCOMMITTED इंगित करता है कि गंदे पढ़ता है, गैर-दोहराने योग्य पढ़ता है, और प्रेत रीड पढ़ सकता है। |
4 | TransactionDefinition.ISOLATION_REPEATABLE_READ इंगित करता है कि गंदे पढ़ता है और गैर-दोहराने योग्य रीड को रोका जाता है; प्रेत रीडिंग हो सकती है। |
5 | TransactionDefinition.ISOLATION_SERIALIZABLE इंगित करता है कि गंदे पढ़ता है, गैर-दोहराने योग्य पढ़ता है, और प्रेत रीड को रोका जाता है। |
प्रसार प्रकारों के लिए संभावित मूल्य निम्नलिखित हैं -
अनु क्रमांक। | प्रचार और विवरण |
---|---|
1 | TransactionDefinition.PROPAGATION_MANDATORY एक वर्तमान लेनदेन का समर्थन करता है; यदि कोई मौजूदा लेन-देन मौजूद नहीं है, तो एक अपवाद फेंकता है। |
2 | TransactionDefinition.PROPAGATION_NESTED यदि वर्तमान लेनदेन मौजूद है, तो एक नेस्टेड लेनदेन के भीतर निष्पादित। |
3 | TransactionDefinition.PROPAGATION_NEVER वर्तमान लेनदेन का समर्थन नहीं करता है; यदि कोई मौजूदा लेन-देन मौजूद है, तो एक अपवाद फेंकता है। |
4 | TransactionDefinition.PROPAGATION_NOT_SUPPORTED वर्तमान लेनदेन का समर्थन नहीं करता है; बल्कि हमेशा nontransactically निष्पादित करें। |
5 | TransactionDefinition.PROPAGATION_REQUIRED एक वर्तमान लेनदेन का समर्थन करता है; यदि कोई मौजूद नहीं है तो एक नया निर्माण करता है। |
6 | TransactionDefinition.PROPAGATION_REQUIRES_NEW यदि कोई मौजूद है, तो वर्तमान लेनदेन को स्थगित करते हुए एक नया लेनदेन बनाता है। |
7 | TransactionDefinition.PROPAGATION_SUPPORTS एक वर्तमान लेनदेन का समर्थन करता है; यदि कोई मौजूद नहीं है, तो गैर-लेन-देन निष्पादित करता है। |
8 | TransactionDefinition.TIMEOUT_DEFAULT अंतर्निहित लेनदेन प्रणाली के डिफ़ॉल्ट टाइमआउट का उपयोग करता है, या टाइमआउट का समर्थन नहीं करने पर कोई नहीं। |
TransactionStatus इंटरफेस नियंत्रण लेनदेन निष्पादन और क्वेरी लेन-देन की स्थिति के व्यवहार कोड के लिए एक आसान तरीका प्रदान करता है।
public interface TransactionStatus extends SavepointManager {
boolean isNewTransaction();
boolean hasSavepoint();
void setRollbackOnly();
boolean isRollbackOnly();
boolean isCompleted();
}
अनु क्रमांक। | विधि और विवरण |
---|---|
1 | boolean hasSavepoint() यह विधि लौटाती है कि क्या यह लेन-देन आंतरिक रूप से एक बचत बिंदु को वहन करता है, अर्थात, एक बचत के आधार पर नेस्टेड लेनदेन के रूप में बनाया गया है। |
2 | boolean isCompleted() यह विधि लौटाती है कि क्या यह लेन-देन पूरा हो गया है, अर्थात, चाहे वह पहले से ही प्रतिबद्ध हो या लुढ़का हुआ हो। |
3 | boolean isNewTransaction() वर्तमान लेनदेन नया होने की स्थिति में यह तरीका सही है। |
4 | boolean isRollbackOnly() यह विधि लौटाती है कि क्या लेन-देन केवल रोलबैक के रूप में चिह्नित किया गया है। |
5 | void setRollbackOnly() यह विधि लेन-देन को केवल रोलबैक के रूप में सेट करती है। |