ماذا يفعل Postgres عندما يتم تشغيله على اتصال في وضع AutoCommit؟

StackOverflow https://stackoverflow.com/questions/2478518

سؤال

أحاول أن أفهم بشكل أفضل مفهوم "AutoCommit" عند العمل مع اتصال Postgres (PSYCOPG). لنفترض أن لدي اتصالًا جديدًا ، وضبط مستوى العزلة على arsidation_level_autocommit ، ثم قم بتشغيل هذا SQL مباشرة ، دون استخدام أساليب البداية/التراجع المؤشر (كتمرين ؛ لا أقول أنني أريد بالفعل القيام بذلك):

INSERT A
INSERT B
BEGIN
    INSERT C
    INSERT D
ROLLBACK

ماذا يحدث لإدراج C&D؟

هل AutoCommit هو محض محض في psycopg الذي يؤثر على كيفية بدء مشكلاتها؟ في هذه الحالة ، فإن SQL أعلاه غير متأثرة ؛ يتم ارتكاب إدراج A&B بمجرد الانتهاء من ذلك ، بينما يتم تشغيل C&D في معاملة وتراجع. ما هو مستوى العزلة التي يتم تشغيل هذه المعاملة؟

أم أن AutoCommit إعداد حقيقي على الاتصال نفسه؟ في هذه الحالة ، كيف يؤثر ذلك على التعامل مع البداية؟ هل تم تجاهله ، أم أنه يتجاوز إعداد AutoCommit لبدء معاملة بالفعل؟ ما هو مستوى العزلة التي يتم تشغيل هذه المعاملة؟

أم أنا خارج الهدف تماما؟

هل كانت مفيدة؟

المحلول

يعني وضع AutoCommit أن كل عبارة تبدأ ضمنيًا وينهي المعاملة.

في حالتك ، إذا كان AutoCommit خارجًا:

  • سيبدأ العميل ضمنيًا المعاملة للبيان الأول
  • ال BEGIN سيصدر تحذيرًا يقول إن الصفقة بدأت بالفعل
  • ال ROLLBACK سوف تراجع عن جميع العبارات الأربعة

عندما يتم تشغيل AutoCommit ، فقط c و d يتم لفها.

لاحظ أن PostgreSQL ليس له داخلي AUTOCOMMIT السلوك منذ ذلك الحين 8.0: يتم الاعتماد على جميع ميزات AutoCommit على العملاء.

نصائح أخرى

بشكل افتراضي ، لدى PostgreSQL لالتزام تلقائي ، مما يعني أنه يتم التعامل مع كل عبارة كمعاملة. إذا أخبرتها صراحةً أن تبدأ معاملة ، كما في مثالك ، تكون هذه العناصر في معاملة جديدة.

في مثالك ، سيتم ارتكاب A و B ، سيتم التراجع عن C و D.

عندما يكون AutoCommit على Psycopg ، يرسل كل شيء إلى الواجهة الخلفية PostgreSQL دون محاولة إدارة المعاملة لك. إذا لم تستخدم BEGIN/CANK/ROWBACK ، فسيتم تنفيذ كل مكالمة .execute () على الفور وارتكابها. يمكنك القيام بإدارة المعاملات الخاصة بك عن طريق إصدار أوامر Begin/Compl/Rollback. من الواضح في وضع AutoCommit ، لا يمكنك استدعاء conn.commit () أو conn.rollback () لأن psycopg لا يتتبع المعاملات ولكن مجرد إرسال أي شيء. execute () مباشرة إلى الواجهة الخلفية.

في المثال الخاص بك ، سيتم ارتكاب A و B ، سيتم التراجع عن C و D.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top