পোস্টগ্ররেএসকিউএল-এ লেনদেনগুলি কি প্রতি কার্সার `সাইকোপগ 2` বা প্রতি সংযোগের মাধ্যমে রয়েছে?


10

আমি psycopg2ডেটাবেস এপিআই ব্যবহার করে পোস্টগ্রিসকিউএল 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

লেনদেনগুলি প্রতি সেশনে অর্থাৎ প্রতি সংযোগে হয়।

পোস্টগ্রেএসকিউএল লেনদেন স্থগিত করা এবং পুনরায় শুরু করতে সমর্থন করে না, সুতরাং সাইক্রকজি 2 সেগুলি প্রতি কার্সর হিসাবে তৈরি করতে পারে না যতক্ষণ না এটি স্পষ্টভাবে পর্দার আড়ালে নতুন সংযোগ তৈরি করে।

অনুশীলনে আমি সাইকোপজি 2 এর কার্সারগুলি বিশেষভাবে দরকারী বলে খুঁজে পাই না। আপনি যদি সার্ভার থেকে ক্রমবর্ধমান আনয়ন না করেন তবে তারা ফলাফলের সেটগুলি ধরে রাখতে পারে তবে আমি এগুলি অন্য কোনও কারণে ভাল পাই না।

কেন ম্যানুয়ালি ইস্যু করবেন beginএবং commitযদিও তাদের জন্য সংযোগ পদ্ধতিগুলি ব্যবহার করার চেয়ে?


ডকুমেন্টেশন থেকে আফ্রিক, পুরো "ডিবি এপিআই" মডেলটি প্রকৃতপক্ষে স্পষ্ট লেনদেনকে সমর্থন করে না।
ভুয়া নাম

1
@ ফেকনাম আপনি পরিষ্কারভাবে বলতে হবে না begin। যদি কোনও লেনদেন না খোলা থাকে তবে আপনার জন্য একটি নতুন চালু করা হবে। আপনি কেবল commitলেনদেনের বর্ণনা করতে পারেন। সুতরাং হ্যাঁ, ডিবি-এপিআই মডেল সুস্পষ্ট লেনদেনকে সমর্থন করে
ক্রেগ রিঞ্জার

1
যদি ডিবি এপি এটির জন্য আমার নির্দিষ্টভাবে নির্দেশ না দিয়ে এটি স্বয়ংক্রিয়ভাবে করে চলেছে তবে এটি খুব একটা অন্তর্নিহিত শুরু। এবং তদ্ব্যতীত, এটি অপ্রাসঙ্গিক, যেহেতু (যেমন আমি প্রশ্নে বলেছি), আমি স্বতঃআপনার মোডটি ব্যবহার করছি, কারণ আমি সেই স্বয়ংক্রিয় বিবৃতি চাই নাBEGIN । আমি psycopg2প্রত্যেকের জন্য একটি নতুন লেনদেন তৈরি করতে চাই না SELECT
ভুয়া নাম

টিএল; ডিআর মূলত আমি সমস্ত লেনদেনের সঠিক সুযোগটি জানতে চাই কারণ এ। আমি সেভাবে পাগল, এবং বি এটি ডিবাগিংয়ে অনেক সাহায্য করে।
ভুয়া নাম

1
বিজোড় বাগগুলি এটিকে পপ করতে দেখে আমি অবাক হব না। আফাইক অটোকোমিটটি হ'ল ম্যানুয়াল-লেনদেন-পরিচালন নয় বরং স্বায়ত্তশক্তি হিসাবে বোঝানো হয়েছিল । আপনি যদি সত্যিই লেনদেনের স্কোপগুলি ম্যানুয়ালি পরিচালনা করতে চান তবে একটি অতিরিক্ত BEGINনিরীহ এবং এটি পোস্টগ্র্রেএসকিউএল দ্বারা উপেক্ষা করা হবে WARNING: there is already a transaction in progress
ক্রেগ রিঞ্জার

1

থেকে psycopg2 ডকুমেন্টেশন:

সাইকোপগে লেনদেনগুলি সংযোগ শ্রেণীর দ্বারা পরিচালিত হয়। ডিফল্টরূপে, প্রথমবার একটি কমান্ড ডাটাবেসে প্রেরণ করা হয় (সংযোগ দ্বারা নির্মিত কার্সারগুলির মধ্যে একটি ব্যবহার করে), একটি নতুন লেনদেন তৈরি হয়। নিম্নলিখিত লেনদেনের আদেশগুলি একই লেনদেনের প্রসঙ্গে কার্যকর করা হবে - কেবল প্রথম কার্সার দ্বারা জারি করা কমান্ডগুলিই নয়, একই সংযোগ দ্বারা নির্মিত সমস্ত কার্সার দ্বারা জারি করা আদেশগুলিও। যদি কোনও কমান্ড ব্যর্থ হয় তবে লেনদেন বাতিল হয়ে যাবে এবং রোলব্যাক () পদ্ধতিতে কল না দেওয়া পর্যন্ত পরবর্তী কোনও আদেশ কার্যকর করা হবে না।

একই সময়ে, সংস্করণ ২.৪.২ থেকে autocommitবৈশিষ্ট্যটি রয়েছে (জোর দেওয়া হয়েছে):

পড়ুন / লেখুন বৈশিষ্ট্য: যদি True, ড্রাইভার কোনও লেনদেন পরিচালনা করে না এবং ব্যাকএন্ডে পাঠানো প্রতিটি বিবৃতি তাত্ক্ষণিকভাবে কার্যকর হয়; যদি False প্রথম কমান্ডের প্রয়োগে একটি নতুন লেনদেন শুরু হয় : লেনদেনটি বন্ধ করার জন্য পদ্ধতিগুলি commit()বা rollback()ম্যানুয়ালি আহ্বান করতে হবে।

স্বতঃসংশ্লিষ্ট মোড একটি লেনদেনের বাইরে চালানোর জন্য প্রয়োজনীয় কমান্ডগুলি কার্যকর করতে কার্যকর হয় যেমন CREATE DATABASEবা VACUUM

Falseডিবিএপিআই স্পেসিফিকেশন অনুযায়ী ডিফল্ট হ'ল (ম্যানুয়াল কমিট)।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.