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