एक लेन-देन के भीतर लेनदेन


18

उदाहरण के लिए नीचे दी गई स्क्रिप्ट को कहा जाता है तो PostgreSQL प्रदर्शन क्या व्यवहार करेगा

BEGIN;
SELECT * FROM foo;
INSERT INTO foo(name) VALUES ('bar');
BEGIN; <- The point of interest
END;

क्या PostgreSQL दूसरे को त्याग BEGINदेगा या एक प्रतिबद्ध होगा जिस पर तुरंत निर्णय लिया जाएगा और फिर BEGIN ENDअंत में एक अलग लेनदेन के रूप में ब्लॉक चलाया जाएगा ?

जवाबों:


13

आपको जिस चीज की आवश्यकता होगी वह एक तथाकथित "स्वायत्त लेनदेन" (ओरेकल द्वारा प्रदान की गई सुविधा) है। इस समय यह अभी तक PostgreSQL में संभव नहीं है। हालाँकि, आप SAVEPOINT s का उपयोग कर सकते हैं :

BEGIN;
INSERT ...
SAVEPOINT a;
some error;
ROLLBACK TO SAVEPOINT a;
COMMIT;

यह पूरी तरह से एक स्वायत्त लेनदेन नहीं है - लेकिन, यह आपको "हर लेन-देन" प्राप्त करने की अनुमति देता है। स्वायत्त लेनदेन से आप जिस चीज की उम्मीद करते हैं, उसे प्राप्त करने के लिए आप इसका उपयोग कर सकते हैं।

अन्यथा इस बिंदु पर कोई अन्य उचित समाधान नहीं है।


13

आप इसे स्वयं आजमा सकते हैं:

चेतावनी: प्रगति में पहले से ही एक लेनदेन है

यह कोई नया (उप) लेनदेन शुरू नहीं करता है क्योंकि नेस्टेड लेनदेन PostgreSQL में लागू नहीं होते हैं। (आप एक pl/pgsqlसमारोह में कुछ जादू कर सकते हैं , उदाहरण के लिए, उस व्यवहार की नकल करता है, हालांकि।)

PostgreSQL 11 के साथ, कोई भी नई वास्तविक संग्रहीत प्रक्रियाओं के बारे में सोच सकता है और लेनदेन को संभालने की उनकी क्षमता नेस्टेड लेनदेन को संभव बनाएगी। हालाँकि, प्रलेखन के अनुसार , यह मामला नहीं है:

CALLकमांड के साथ-साथ अनाम कोड ब्लॉक ( DOकमांड) में लागू प्रक्रियाओं में , आदेशों का उपयोग करके लेनदेन को समाप्त करना संभव है COMMITऔर ROLLBACK। इन आदेशों का उपयोग करके लेन-देन समाप्त होने के बाद एक नया लेनदेन स्वचालित रूप से शुरू होता है, इसलिए अलग-अलग START TRANSACTION कमांड नहीं है।


9

PostgreSQL उप-लेन-देन का समर्थन नहीं करता है, लेकिन SAVEPOINTसुविधा आपकी आवश्यकता का प्रभावी ढंग से जवाब दे सकती है। GitHub पर विटाली टोमिलोव द्वारा वादों के माध्यम से पीजी के लिए उन्नत पहुंच परत के लिए प्रलेखन से उद्धरण :

PostgreSQL के पास नेस्टेड लेनदेन के लिए उचित समर्थन नहीं है, यह केवल लेनदेन के अंदर बचत के माध्यम से आंशिक रोलबैक का समर्थन करता है । दो तकनीकों के बीच का अंतर बहुत बड़ा है, जैसा कि आगे बताया गया है।

नेस्टेड लेन-देन के लिए उचित समर्थन का मतलब है कि एक सफल उप-लेन-देन का परिणाम वापस नहीं लुढ़का है जब उसके मूल लेनदेन को वापस ले लिया गया है। लेकिन PostgreSQL के बचत-बिंदुओं के साथ, यदि आप शीर्ष-स्तर के लेन-देन को रोल-बैक करते हैं, तो सभी इनर-सेव-पॉइंट्स का परिणाम भी वापस आ जाता है।

एक सक्रिय लेन-देन के अंदर पिछले बिंदु पर आंशिक रोलबैक के लिए Savepoint का उपयोग किया जा सकता है। उदाहरण के लिए, सहेजने के लिए और बाद में स्थापित किए गए सभी आदेशों के प्रभावों को पूर्ववत करने के लिए:

BEGIN;
    INSERT INTO table1 VALUES (1);
    SAVEPOINT my_savepoint;
    INSERT INTO table1 VALUES (2);
    ROLLBACK TO SAVEPOINT my_savepoint;
    INSERT INTO table1 VALUES (3);
COMMIT;

उपरोक्त लेनदेन 1 और 3 मान डालेगा, लेकिन 2 नहीं। SAVEPOINTअधिक जानकारी के लिए दस्तावेज़ देखें ।


0

Postgresql 9.5 या नए के लिए आप pg_background एक्सटेंशन द्वारा प्रदान किए गए डायनामिक बैकग्राउंड वर्कर्स का उपयोग कर सकते हैं। यह स्वायत्त लेनदेन बनाता है। कृपया, विस्तार के github पृष्ठ को देखें । तो बेहतर है db_link। PostgreSQL में ऑटोनॉमस ट्रांजैक्शन सपोर्ट पर एक पूरी गाइड है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.