मुझे लगता है कि आपने गलत समझा PREPARE TRANSACTION ।
वह कथन लेन-देन पर काम समाप्त करता है, अर्थात, इसे बाद जारी किया जाना चाहिए सभी काम किया जाता है। विचार यह है कि PREPARE TRANSACTION वह सब कुछ करता है जो कमिटमेंट के दौरान संभावित रूप से विफल हो सकता है सिवाय कमिटमेंट के। यह गारंटी देने के लिए है कि बाद में COMMIT PREPARED विफल नहीं हो सकता।
विचार यह है कि प्रसंस्करण इस प्रकार है:
-
START TRANSACTIONRun चलाएं वितरित लेनदेन में शामिल सभी डेटाबेस पर। -
सारे काम करो। यदि त्रुटियां हैं, तो
ROLLBACKसभी लेन-देन। -
PREPARE TRANSACTIONचलाएं सभी डेटाबेस पर। यदि वह कहीं भी विफल हो जाता है, तोROLLBACK PREPAREDचलाएं उन डेटाबेस पर जहां लेनदेन पहले से ही तैयार था औरROLLBACKदूसरों पर। -
एक बार
PREPARE TRANSACTIONहर जगह सफल रहा है,COMMIT PREPAREDचलाएं सभी शामिल डेटाबेस पर।
इस तरह, आप कई डेटाबेस में "सभी या कुछ नहीं" की गारंटी दे सकते हैं।
यहां एक महत्वपूर्ण घटक जिसका मैंने उल्लेख नहीं किया है वह है वितरित लेनदेन प्रबंधक . यह सॉफ्टवेयर का एक टुकड़ा है जो लगातार याद रखता है कि वर्तमान में उपरोक्त एल्गोरिथम प्रसंस्करण कहाँ है ताकि यह एक दुर्घटना के बाद साफ या जारी रख सके।
एक वितरित लेनदेन प्रबंधक के बिना, दो-चरण की प्रतिबद्धता बहुत अधिक नहीं है, और यह वास्तव में खतरनाक है:यदि लेनदेन "तैयार" चरण में फंस जाते हैं, लेकिन अभी तक प्रतिबद्ध नहीं हैं, तो वे ताले रखना जारी रखेंगे और (के मामले में) PostgreSQL) ऑटोवैक्यूम काम को ब्लॉक करता है यहां तक कि सर्वर के पुनरारंभ होने पर भी , क्योंकि ऐसे लेन-देन लगातार होने चाहिए।
इसे ठीक करना मुश्किल है।