تكرار السؤال: …
الإجابة المختصرة
نفّذ مجموعة التغييرات كوحدة ذرية: commit عند نجاحها كلها و rollback عند فشل أي جزء، وأسهل طريقة استخدام الاتصال كمدير سياق with conn.
الشرح
استخدام with conn: لا يغلق الاتصال، بل يؤكد المعاملة أو يلغيها فقط؛ يجب إغلاق الاتصال بنفسك أو عبر contextlib.closing. منذ Python 3.12 تتيح الخاصية autocommit تحكمًا أوضح متوافقًا مع PEP 249. اجعل المعاملات قصيرة لأن SQLite يقفل قاعدة البيانات للكتابة أثناءها. ولاحظ أن المعاملة لا تحميك من تكرار الطلب عبر الشبكة؛ فهذا يحتاج idempotency.
مثال بالكود
import sqlite3
from contextlib import closing
with closing(sqlite3.connect("bank.db")) as conn:
with conn: # BEGIN ... COMMIT أو ROLLBACK
conn.execute("UPDATE accounts SET balance = balance - ? WHERE id = ?", (100, 1))
conn.execute("UPDATE accounts SET balance = balance + ? WHERE id = ?", (100, 2))أخطاء شائعة
- افتراض أن with conn يغلق الاتصال.
- تنفيذ التحويل المالي في خطوتين منفصلتين بدون معاملة واحدة.