المعاملات ومديرو السياق
نفّذ الإيداع والتراجع بأمان
المعاملات ومديرو السياق درس مجاني في Python Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Python Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Python Academy 4 دروس في المجموع.
ما المعاملة؟
تجمع المعاملة عدة عبارات بحيث تنجح كلها معًا أو تفشل كلها معًا. وهذا يحافظ على اتساق بياناتكم.
يبدأ SQLite معاملة تلقائيًا قبل العبارات التي تغيّر البيانات.
import sqlite3
conn = sqlite3.connect(':memory:')
cur = conn.cursor()
cur.execute('CREATE TABLE accounts (id INTEGER PRIMARY KEY, balance INTEGER)')
print('Table ready for transactions')
conn.close()الحفظ باستخدام Commit
لا تصبح التغييرات دائمة حتى تستدعوا conn.commit(). وحتى ذلك الحين، تظل موجودة داخل المعاملة الحالية فقط.
import sqlite3
conn = sqlite3.connect(':memory:')
cur = conn.cursor()
cur.execute('CREATE TABLE accounts (id INTEGER PRIMARY KEY, balance INTEGER)')
cur.execute('INSERT INTO accounts (balance) VALUES (100)')
conn.commit()
print('Committed')
conn.close()التراجع
يلغي conn.rollback() كل تغيير منذ آخر عملية حفظ. استخدموه عند حدوث خطأ.
import sqlite3
conn = sqlite3.connect(':memory:')
cur = conn.cursor()
cur.execute('CREATE TABLE accounts (id INTEGER PRIMARY KEY, balance INTEGER)')
conn.commit()
cur.execute('INSERT INTO accounts (balance) VALUES (100)')
conn.rollback()
cur.execute('SELECT COUNT(*) FROM accounts')
print('Rows after rollback:', cur.fetchone()[0])
conn.close()تحويل مالي
تظهر أهمية المعاملات عندما يجب أن تبقى تحديثات متعددة متزامنة. إذ يخصم التحويل البنكي مبلغًا من حساب ويضيفه إلى حساب آخر. يجب تنفيذ العمليتين معًا أو عدم تنفيذ أيٍّ منهما.
import sqlite3
conn = sqlite3.connect(':memory:')
cur = conn.cursor()
cur.execute('CREATE TABLE accounts (id INTEGER PRIMARY KEY, balance INTEGER)')
cur.execute('INSERT INTO accounts (id, balance) VALUES (1, 100)')
cur.execute('INSERT INTO accounts (id, balance) VALUES (2, 50)')
cur.execute('UPDATE accounts SET balance = balance - 30 WHERE id = 1')
cur.execute('UPDATE accounts SET balance = balance + 30 WHERE id = 2')
conn.commit()
cur.execute('SELECT id, balance FROM accounts')
print(cur.fetchall())
conn.close()معالجة الأخطاء باستخدام try/except
غلّفوا المعاملة داخل try/except. وعند حدوث خطأ، نفّذوا التراجع حتى لا تؤدي التغييرات الجزئية إلى إفساد بياناتكم.
import sqlite3
conn = sqlite3.connect(':memory:')
cur = conn.cursor()
cur.execute('CREATE TABLE accounts (id INTEGER PRIMARY KEY, balance INTEGER)')
try:
cur.execute('INSERT INTO accounts (id, balance) VALUES (1, 100)')
cur.execute('INSERT INTO accounts (id, balance) VALUES (1, 200)')
conn.commit()
except sqlite3.IntegrityError:
conn.rollback()
print('Rolled back after error')
conn.close()الاتصال كمدير سياق
يؤدي استخدام with conn: إلى حفظ التغييرات تلقائيًا عند النجاح والتراجع عنها عند حدوث استثناء داخل الكتلة.
import sqlite3
conn = sqlite3.connect(':memory:')
conn.execute('CREATE TABLE accounts (id INTEGER PRIMARY KEY, balance INTEGER)')
with conn:
conn.execute('INSERT INTO accounts (balance) VALUES (100)')
print('Auto-committed via with block')
conn.close()التراجع التلقائي عند حدوث استثناء
إذا أدت كتلة with conn: إلى رفع استثناء، فسيُتراجع عن المعاملة تلقائيًا. لاحظوا أن الاتصال نفسه يظل مفتوحًا.
import sqlite3
conn = sqlite3.connect(':memory:')
conn.execute('CREATE TABLE accounts (id INTEGER PRIMARY KEY)')
try:
with conn:
conn.execute('INSERT INTO accounts (id) VALUES (1)')
conn.execute('INSERT INTO accounts (id) VALUES (1)')
except sqlite3.IntegrityError:
print('Block rolled back automatically')
count = conn.execute('SELECT COUNT(*) FROM accounts').fetchone()[0]
print('Rows:', count)
conn.close()closing() للاتصال
تضمن المساعدة contextlib.closing استدعاء close() عند انتهاء الكتلة، مما يحرّر الاتصال.
import sqlite3
from contextlib import closing
with closing(sqlite3.connect(':memory:')) as conn:
conn.execute('CREATE TABLE t (id INTEGER)')
print('Used inside closing()')
print('Connection closed automatically')دمج النمطين
ضعوا with conn: داخل closing(...) لإدارة المعاملة وضمان إغلاق الاتصال معًا.
import sqlite3
from contextlib import closing
with closing(sqlite3.connect(':memory:')) as conn:
conn.execute('CREATE TABLE t (id INTEGER, v TEXT)')
with conn:
conn.execute('INSERT INTO t VALUES (1, ?)', ('hello',))
print(conn.execute('SELECT * FROM t').fetchall())isolation_level
يتحكم isolation_level الخاص بالاتصال في وقت بدء المعاملات. يتيح الإعداد الافتراضي لـ SQLite إدارتها، بينما يؤدي ضبطه على None إلى تفعيل وضع الحفظ التلقائي.
import sqlite3
conn = sqlite3.connect(':memory:')
print('Default isolation_level:', repr(conn.isolation_level))
conn.isolation_level = None
print('Now autocommit:', conn.isolation_level)
conn.close()لماذا تُعدّ المعاملات مهمة؟
من دون المعاملات، قد يؤدي تعطل البرنامج أثناء التحديث إلى ترك بيانات مكتملة جزئيًا. تجعل المعاملات مجموعة التغييرات ذرّية، أي غير قابلة للتجزئة. وهذا يحمي التكامل.
import sqlite3
conn = sqlite3.connect(':memory:')
conn.execute('CREATE TABLE log (msg TEXT)')
with conn:
conn.execute('INSERT INTO log VALUES (?)', ('all or nothing',))
print('Atomic write done')
conn.close()اختبار سريع
اختبروا معرفتكم بالمعاملات.
مراجعة
تعلّمتم إدارة المعاملات بأمان.
- يحفظ
commit()التغييرات، بينما يلغيهاrollback() - غلّفوا عمليات الكتابة الخطرة داخل
try/exceptمع التراجع - ينفّذ
with conn:الحفظ أو التراجع تلقائيًا - تضمن
contextlib.closingإغلاق الاتصال
الأسئلة الشائعة
هل درس «المعاملات ومديرو السياق» مجاني؟
نعم — نص درس «المعاملات ومديرو السياق» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Python Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Python Academy 4 دروس في المجموع.
ماذا ستتعلم في «المعاملات ومديرو السياق»؟
نفّذ الإيداع والتراجع بأمان تتمرن على Python Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Python Academy؟
لا تُشترط خبرة سابقة. Python Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «المعاملات ومديرو السياق»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Python Academy هذا؟
نعم. كل درس في Python Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- الاتصال وإنشاء الجداول
- Insert وSelect وUpdate وDelete
- الاستعلامات المعلَّمة بالمعاملات
- المعاملات ومديرو السياق