PostgreSQL में लेनदेन `psycopg2` प्रति-कर्सर या प्रति-कनेक्शन के माध्यम से होते हैं?


10

मैं psycopg2डेटाबेस API का उपयोग करके PostgreSQL 9.3 के साथ कुछ काम कर रहा हूं ।

मेरे पास डीबी एपीआई न्यूनतम अलगाव स्तर ("ऑटोकॉमिट" मोड) में सेट है, और मैं सीधे एसक्यूएल के माध्यम से अपने लेनदेन का प्रबंधन कर रहा हूं। उदाहरण:

cur = self.conn.cursor()
cur.execute("BEGIN;")
cur.execute("SELECT dbId, downloadPath, fileName, tags FROM {tableName} WHERE dlState=%s".format(tableName=self.tableName), (2, ))
ret = cur.fetchall()
cur.execute("COMMIT;")

मूल रूप से, क्या लेनदेन cur.execute("BEGIN;")केवल उस कर्सर तक सीमित द्वारा शुरू किया गया है, या यह पूरे कनेक्शन के लिए है ( self.conn.cursor())?

कुछ अधिक जटिल चीजें जो मैं कई अलग-अलग डेटाबेस संचालन शामिल कर रहा हूं, कि मैं तार्किक रूप से कार्यों में टूट जाता हूं। चूँकि यह सब एक ऐसे वर्ग में है जिसका सदस्य के रूप में संबंध है, इसलिए यह प्रत्येक फ़ंक्शन के भीतर कर्सर बनाने के लिए बहुत अधिक सुविधाजनक है। हालाँकि, मुझे यकीन नहीं है कि लेन-देन के कामों के भीतर अभिशाप कैसे पैदा होते हैं ।

मूल रूप से, यदि लेन-देन प्रति-कनेक्शन है, तो मैं लेन-देन के भीतर बहुत सारे कर्सर बना सकता हूं। यदि वे प्रति-कर्सर हैं, तो इसका मतलब है कि मुझे हर जगह कर्सर पास करना होगा। यह किसका है?

प्रलेखन इस पर स्पर्श नहीं करता है, हालांकि आप जिस तथ्य को कॉल कर सकते हैं connection.commit()वह मुझे काफी आश्वस्त करता है कि लेनदेन-नियंत्रण प्रति कनेक्शन है।

जवाबों:


7

लेन-देन प्रति-सत्र, यानी प्रति-कनेक्शन हैं।

PostgreSQL लेनदेन को स्थगित करने और फिर से शुरू करने का समर्थन नहीं करता है, इसलिए psycopg2 उन्हें प्रति-कर्सर नहीं बना सकता है जब तक कि यह पर्दे के पीछे नए कनेक्शन पैदा नहीं करता है।

व्यवहार में मुझे psycopg2 के अभिशाप विशेष रूप से उपयोगी नहीं लगते। यदि आप सर्वर से वृद्धिशील भ्रूण का उपयोग नहीं कर रहे हैं तो वे परिणाम सेट बनाए रख सकते हैं, लेकिन मैं उन्हें और अधिक के लिए अच्छा नहीं लगता।

उनके लिए कनेक्शन विधियों का उपयोग करने के बजाय मैन्युअल रूप से क्यों beginऔर commitयद्यपि, जारी करें?


दस्तावेज़ से AFICT, पूरे "DB API" मॉडल वास्तव में स्पष्ट लेनदेन का समर्थन नहीं करता है।
नकली नाम

1
@ फ़ेकनाम आपको स्पष्ट रूप से नहीं देना है begin। यदि कोई लेनदेन नहीं खुला है, तो आपके लिए एक नया शुरू किया गया है। आप सिर्फ commitलेन-देन को सीमांकित करें। तो हां, DB-API मॉडल स्पष्ट लेनदेन का समर्थन करता है
क्रेग रिंगर

1
डीबी एपीआई मेरी विशेष रूप से है कि बहुत ज्यादा एक है ऐसा करने के लिए, यह निर्देश दिए बिना स्वचालित रूप से यह कर रहा है, तो अंतर्निहित शुरू करते हैं। और इसके अलावा, यह अप्रासंगिक है, क्योंकि (जैसा कि मैंने सवाल में कहा है), मैं ऑटोकॉमिट मोड का उपयोग कर रहा हूं, क्योंकि मैं उन स्वचालित बयान नहीं चाहता हूं BEGIN। मैं psycopg2प्रत्येक के लिए एक नया लेनदेन नहीं बनाना चाहता SELECT
फर्जी नाम

टीएल; डीआर मूल रूप से मैं सभी लेन-देन के सटीक दायरे को जानना चाहता हूं क्योंकि ए। मैं इस तरह से पागल हूं, और बी। यह डिबगिंग में बहुत मदद करता है।
फर्जी नाम

1
मैं अजीब कीड़े इस के साथ popping देखने के लिए आश्चर्य नहीं होगा। AFAIK ऑटोकॉमिट का मतलब वास्तव में ऑटोकॉमिट होना है न कि मैनुअल-ट्रांजेक्शन-मैनेजमेंट। यदि आप वास्तव में लेन-देन स्कोप को मैन्युअल रूप से प्रबंधित करना चाहते हैं, तो एक अतिरिक्त BEGINहानिरहित है और बस पोस्टग्रेक्यूएल द्वारा अनदेखा किया जाएगा WARNING: there is already a transaction in progress
क्रेग रिंगर

1

से psycopg2 प्रलेखन:

Psycopg में लेनदेन कनेक्शन वर्ग द्वारा नियंत्रित किया जाता है। डिफ़ॉल्ट रूप से, पहली बार कमांड को डेटाबेस में भेजा जाता है (कनेक्शन द्वारा बनाए गए कर्सर में से एक का उपयोग करके), एक नया लेनदेन बनाया जाता है। निम्नलिखित डेटाबेस आदेशों को एक ही लेन-देन के संदर्भ में निष्पादित किया जाएगा - न केवल पहले कर्सर द्वारा जारी किए गए आदेश, बल्कि सभी एक ही कनेक्शन द्वारा बनाए गए सभी कर्सर द्वारा जारी किए गए। क्या कोई भी आदेश विफल हो जाना चाहिए, लेन-देन निरस्त कर दिया जाएगा और रोलबैक () पद्धति पर कॉल करने तक किसी भी आदेश को निष्पादित नहीं किया जाएगा।

उसी समय, संस्करण २.४.२ में, autocommitविशेषता है (जोर दिया गया):

विशेषता पढ़ें / लिखें: यदि True, ड्राइवर द्वारा कोई लेन-देन नहीं किया जाता है और बैकएंड पर भेजे गए प्रत्येक विवरण का तत्काल प्रभाव पड़ता है; यदि False पहले आदेश निष्पादन पर एक नया लेन-देन शुरू किया गया है : लेनदेन को समाप्त करने के लिए तरीके commit()या rollback()मैन्युअल रूप से लागू किए जाने चाहिए।

ऑटोकॉमिट मोड एक लेनदेन के बाहर चलाने के लिए आवश्यक कमांड को निष्पादित करने के लिए उपयोगी है, जैसे कि CREATE DATABASEया VACUUM

Falseडीबीएपीआई विनिर्देश के अनुसार डिफ़ॉल्ट (मैनुअल कमिट) है।

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