لماذا الحاجة إلى الالتزام بشكل صريح عند إجراء التحديث؟

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

  •  27-09-2019
  •  | 
  •  

سؤال

هذا هو الكود الخاص بي:

import cx_Oracle

conn = cx_Oracle.connect(usr, pwd, url)
cursor = conn.cursor()
cursor.execute("UPDATE SO SET STATUS='PE' WHERE ID='100'")
conn.commit()

إذا قمت بإزالة conn.commit(), ، لم يتم تحديث الجدول. لكن بالنسبة لبيانات محددة ، لست بحاجة إلى ذلك conn.commit(). أنا فضولي لماذا؟

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

المحلول

ال DB-API يتطلب المواصفات أن يبدأ الاتصال بقاعدة البيانات معاملة جديدة بشكل افتراضي. يجب عليك أن commit لتأكيد أي تغييرات تقوم بها ، أو rollback لتجاهلهم.

لاحظ أنه إذا كانت قاعدة البيانات تدعم ميزة الالتزام التلقائي ، فيجب إيقاف تشغيل ذلك في البداية.

نقي SELECT البيانات ، نظرًا لأنها لا تؤدي أبدًا أي تغييرات على قاعدة البيانات ، لا يجب أن تُلزم تغييراتها.

نصائح أخرى

يتم استخدام الالتزام لإخبار قاعدة البيانات لحفظ جميع التغييرات في المعاملة الحالية.

SELECT لا يغير أي بيانات ، لذلك لا يوجد شيء للحفظ ، وبالتالي لا شيء يلتزم به

يرى ويكيبيديا للمعاملات

أوضح آخرون سبب عدم ضرورة الالتزام في بيان محدد. أردت فقط أن أشير إلى أنه يمكنك الاستفادة من autocommit خاصية اتصال اعترض على تجنب الاضطرار إلى تنفيذ الالتزام يدويًا:

import cx_Oracle

with cx_Oracle.connect(usr, pwd, url) as conn:
    conn.autocommit = True
    cursor = conn.cursor()
    cursor.execute("UPDATE SO SET STATUS='PE' WHERE ID='100'")
    cursor.close()

يعد هذا مفيدًا بشكل خاص عندما يكون لديك العديد من الإدراج وتحديث وحذف العبارات ضمن نفس الاتصال.

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