انتقل إلى محتوى الدرس
الدرس 60
دورة MySQL

التحكم بالمعاملات عبر COMMIT و ROLLBACK و SAVEPOINT في MySQLMySQL Controlling Transactions with COMMIT ROLLBACK and SAVEPOINT

تعلّم التحكم بالمعاملات عبر COMMIT و ROLLBACK و SAVEPOINT في MySQL بأسلوب MySQL 8 الحديث مع أمثلة استعلامات SQL وتطبيقات تفاعلية.
أقسام الدرس
6
الأمثلة
5
اللغة
العربية
تاريخ النشر
غير محدد
المشاهدات
7
محتوى الدرس
في هذا الدرس 6تصفّح المواضيع
مخطط توضيحي لدرس التحكم بالمعاملات عبر COMMIT و ROLLBACK و SAVEPOINT في MySQL
مخطط توضيحي لدرس التحكم بالمعاملات عبر COMMIT و ROLLBACK و SAVEPOINT في MySQL

بدلاً من تعطيل متغير الجلسة SET autocommit = 0 يدوياً وتذكر إعادته، تعتمد التطبيقات القياسية في بيئات الإنتاج على بدء المعاملة صراحةً بالأمر START TRANSACTION; (أو مرادفه BEGIN;). يقوم هذا الأمر بتعليق الحفظ التلقائي مؤقتاً طوال فترة المعاملة الحالية فقط، ثم يعيد الجلسة تلقائياً إلى حالتها الأصلية فور انتهاء المعاملة:

  • START TRANSACTION;: الصيغة القياسية لفتح سياق معاملة جديدة داخل محرك InnoDB.
  • BEGIN;: مرادف مختصر في الجلسات المباشرة، لكن يُفضَّل دائماً استخدام START TRANSACTION; لأن كلمة BEGIN تُستخدم داخل الإجراءات المخزنة لبدء الكتل البرمجية.
  • UPDATE wallet_ledgers ...: تُنفَّذ أوامر الخصم والإيداع داخل مخزن المعاملة المؤقت مع الاحتفاظ بالقيم السابقة في سجل التراجع.
  • COMMIT;: ينهي المعاملة الصريحة ويعتمد التعديلات نهائياً على القرص ويعيد تفعيل الحفظ التلقائي للجلسة.
+------------+--------+---------+
| account_id | holder | balance |
+------------+--------+---------+
|        101 | Mona   |  700.00 |
|        102 | Tariq  |  600.00 |
+------------+--------+---------+
SQL
START TRANSACTION;

UPDATE wallet_ledgers SET balance = balance - 200.00 WHERE account_id = 101;
UPDATE wallet_ledgers SET balance = balance + 200.00 WHERE account_id = 102;

SELECT account_id, holder, balance FROM wallet_ledgers;
COMMIT;

يُعلن الأمر COMMIT; اكتمال جميع خطوات المعاملة الحالية بنجاح ووجوب تثبيتها بشكل دائم في قاعدة البيانات. عند تنفيذ COMMIT;، يفرغ محرك InnoDB سجل الإعادة إلى القرص الصلب ويحرر جميع أقفال الصفوف المحتجزة:

  • INSERT INTO order_payments: يسجل عملية الدفع المالي داخل نطاق المعاملة النشطة.
  • UPDATE customer_orders: يحدّث حالة الطلب رقم 310 إلى مدفوع ('paid') ضمن نفس الكتلة الذرية لضمان تطابق السجلين.
  • COMMIT;: يكتب علامة الاعتماد في سجل الإعادة ويجعل التعديلات مرئية لجميع الجلسات الأخرى ويحرر الأقفال.
  • استحالة التراجع بعد COMMIT: بمجرد نجاح أمر الاعتماد، تُغلق المعاملة نهائياً ولا يمكن التراجع عنها بأمر ROLLBACK;.
Query OK, 1 row affected (0.00 sec)
Query OK, 1 row affected (0.00 sec)
Query OK, 0 rows affected (0.01 sec) -- COMMIT persisted to disk
SQL
START TRANSACTION;

INSERT INTO order_payments (payment_id, order_id, amount, status)
VALUES (5001, 310, 275.00, 'captured');

UPDATE customer_orders SET payment_state = 'paid' WHERE order_id = 310;
COMMIT;

محاكي أوامر COMMIT و ROLLBACK و SAVEPOINT

عند فشل أي شرط منطقي أثناء العملية (مثل عدم كفاية الرصيد، أو نفاد المخزون، أو تعديل صفوف بالخطأ أثناء جلسة عمل)، يقوم الأمر ROLLBACK; بإجهاض المعاملة النشطة واسترجاع القيم الأصلية لجميع الصفوف المتأثرة من سجل التراجع (Undo Log):

  • START TRANSACTION;: يفتح مظلة الحماية قبل تنفيذ أي أمر تعديل أو حذف حساس.
  • UPDATE wallet_ledgers SET balance = 0.00: يعدل الرصيد مؤقتاً داخل الجلسة الحالية مع بقاء الرصيد الأصلي محفوظاً في سجل التراجع.
  • ROLLBACK;: يعكس جميع التغييرات التي جرت منذ بداية المعاملة ويحرر الأقفال ويغلق المعاملة بأمان.
  • SELECT account_id, balance ...: يؤكد عودة رصيد الحساب رقم 101 إلى قيمته الأصلية السليمة دون أي تلف.
+------------+---------+
| account_id | balance |
+------------+---------+
|        101 |  900.00 |
+------------+---------+
SQL
START TRANSACTION;

UPDATE wallet_ledgers SET balance = 0.00 WHERE account_id = 101;
SELECT account_id, balance FROM wallet_ledgers WHERE account_id = 101;

-- Discard the accidental update and restore the original balance:
ROLLBACK;
SELECT account_id, balance FROM wallet_ledgers WHERE account_id = 101;

في العمليات متعددة المراحل مثل إصدار الفواتير، قد ترغب في الاحتفاظ بالخطوات الأساسية الناجحة (مثل تسجيل المنتج الرئيسي) حتى لو فشلت خطوة فرعية اختيارية (مثل إضافة عرض ترويجي). يتيح لك MySQL 8 وضع علامات مرجعية مسماة داخل المعاملة النشطة عبر الأمر SAVEPOINT:

  • SAVEPOINT sp_after_core;: ينشئ نقطة حفظ مرجعية بعد إدراج البند الأساسي الأول (901).
  • INSERT INTO invoice_items VALUES (902, ...): يدرج بنداً إضافياً بعد نقطة الحفظ.
  • ROLLBACK TO SAVEPOINT sp_after_core;: يتراجع جزئياً عن الأوامر التي نُفذت بعد العلامة sp_after_core فقط (يلغي البند 902) مع إبقاء المعاملة مفتوحة والاحتفاظ بالبند الأساسي 901.
  • COMMIT;: يعتمد المعاملة نهائياً ليُحفظ البند 901 على القرص.
+---------+------------+--------------+--------+
| item_id | invoice_id | item_label   | price  |
+---------+------------+--------------+--------+
|     901 |         40 | Core License | 120.00 |
+---------+------------+--------------+--------+
SQL
START TRANSACTION;
INSERT INTO invoice_items VALUES (901, 40, 'Core License', 120.00);
SAVEPOINT sp_after_core;

INSERT INTO invoice_items VALUES (902, 40, 'Trial Addon', 999.00);
ROLLBACK TO SAVEPOINT sp_after_core;
COMMIT;

بمجرد التأكد من سلامة خطوة فرعية داخل المعاملة وعدم الحاجة للعودة إلى علامتها المرجعية، يمكنك إزالة العلامة بالأمر RELEASE SAVEPOINT لتنظيم تدفق المعاملة:

  • RELEASE SAVEPOINT sp_step_one;: يحذف اسم نقطة الحفظ من ذاكرة المعاملة الحالية دون التراجع عن البيانات أو اعتمادها.
  • التحرير التلقائي عند الإغلاق: يؤدي تنفيذ COMMIT; أو ROLLBACK; الكامل إلى مسح وتحرير جميع نقاط الحفظ التابعة لتلك المعاملة تلقائياً.
  • الخطأ القياسي 1305: محاولة استدعاء نقطة حفظ بعد تحريرها أو بعد انتهاء المعاملة تُرجع الخطأ ERROR 1305 (42000): SAVEPOINT does not exist.
  • قاعدة قِصر زمن المعاملة: اجعل المعاملات سريعة ومباشرة، ولا تنتظر إدخال المستخدم البشري أبداً بينما المعاملة مفتوحة وتحتجز أقفال الصفوف.
SQL
START TRANSACTION;
UPDATE wallet_ledgers SET balance = balance - 80.00 WHERE account_id = 101;
SAVEPOINT sp_step_one;

UPDATE wallet_ledgers SET balance = balance + 80.00 WHERE account_id = 102;
RELEASE SAVEPOINT sp_step_one;
COMMIT;

يقارن الجدول المرجعي التالي بين جميع أوامر التحكم بالمعاملات (TCL) في MySQL 8 وتأثير كل منها على البيانات والأقفال:

الأمر البرمجيالأثر على تعديلات البياناتحالة المعاملةالأثر على أقفال الصفوف
START TRANSACTION;يفتح سجل التراجع للأوامر التاليةيبدأ معاملة صريحةيحجز الأقفال عند تعديل الصفوف
COMMIT;يثبت التعديلات نهائياً على القرصيغلق المعاملة ويعيد الحفظ التلقائييحرر جميع الأقفال المحتجزة
ROLLBACK;يلغي كل التعديلات منذ بداية المعاملةيغلق المعاملة ويعيد الحفظ التلقائييحرر جميع الأقفال المحتجزة
SAVEPOINT name;يضع علامة مرجعية في سجل التراجعتبقى المعاملة مفتوحةتبقى الأقفال محتجزة
ROLLBACK TO SAVEPOINT name;يلغي التعديلات التي تلت العلامة فقطتبقى المعاملة مفتوحةيحتفظ بأقفال الخطوات السابقة
RELEASE SAVEPOINT name;يبقي جميع التعديلات كما هييحذف العلامة وتبقى المعاملة مفتوحةتبقى الأقفال محتجزة

ملخص الدرس: أتقنت في هذا الدرس بدء المعاملات الصريحة بـ START TRANSACTION، واعتمادها نهائياً بـ COMMIT، والتراجع الكامل بـ ROLLBACK، وإدارة التراجع الجزئي عبر SAVEPOINT وRELEASE SAVEPOINT.
الخطوة التالية والدرس القادم: انتقل إلى الدرس التالي لدراسة مستويات عزل المعاملات الأربعة وتقنية MVCC وأقفال الصفوف بـ FOR UPDATE.

خلاصة المعرفة ومحطة الانتقال

ملخص الدرس

حصاد الدرس

مراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي

ماذا تعلّمت في هذا الدرس؟

تمنحك أوامر START TRANSACTION وCOMMIT وROLLBACK وSAVEPOINT تحكماً كاملاً ودقيقاً في العمليات متعددة الخطوات. الخطوة التالية: انتقل الآن إلى درس «مستويات عزل المعاملات وأقفال الصفوف في MySQL».

مشاركة

هل كان هذا الدرس مفيدًا؟

جارٍ تحميل الآراء…

ابنِ لغتك البرمجية

المصطلحات4

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 4 مفهومةأول بطاقة، أول خطوة
01 COMMIT ROLLBACK إدارة المعاملات
تعلّم التحكم بالمعاملات عبر COMMIT و ROLLBACK و SAVEPOINT في MySQL بأسلوب MySQL 8 الحديث مع أمثلة استعلامات SQL وتطبيقات تفاعلية.
للمراجعة
02 Starting Explicit Transactions بدء المعاملة START TRANSACTION
المفهوم الهندسي الأساسي والصياغة التطبيقية لقسم بدء المعاملة START TRANSACTION في خادم MySQL 8.4.
للمراجعة
03 Persisting Changes with COMMIT اعتماد التغييرات نهائياً COMMIT
المفهوم الهندسي الأساسي والصياغة التطبيقية لقسم اعتماد التغييرات نهائياً COMMIT في خادم MySQL 8.4.
للمراجعة
04 Undoing Mistakes with ROLLBACK التراجع الكامل بأمر ROLLBACK
المفهوم الهندسي الأساسي والصياغة التطبيقية لقسم التراجع الكامل بأمر ROLLBACK في خادم MySQL 8.4.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

حروف قليلة. معنى كامل.

الاختصارات4

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 4 مفهومةأول بطاقة، أول خطوة
01 TCL TCL
Transaction Control Language
مجموعة أوامر التحكم بالمعاملات في SQL وتشمل START TRANSACTION وCOMMIT وROLLBACK وSAVEPOINT.
للمراجعة
02 2PC 2PC
Two-Phase Commit
بروتوكول الاعتماد ثنائي المرحلة الذي ينسق تثبيت أو إلغاء المعاملة بين سجل الإعادة والسجل الثنائي.
للمراجعة
03 DML DML
Data Manipulation Language
أوامر معالجة البيانات INSERT وUPDATE وDELETE التي يمكن اعتمادها أو التراجع عنها داخل المعاملة.
للمراجعة
04 LSN LSN
Log Sequence Number
رقم التسلسل السجلي المتزايد في سجل الإعادة داخل محرك InnoDB لتتبع موضع كل معاملة معتمدة.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

من الفهم للتطبيق

مهامك قبل الاختبار

خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.

0/2مهام منجزة
  1. نفّذ جمل SQL الواردة في قسم بدء المعاملة START TRANSACTION داخل بيئة MySQL 8 المحلية وتحقق من المخرجات.

  2. جرّب الحالات الثلاث داخل محاكي أوامر COMMIT و ROLLBACK و SAVEPOINT في قسم اعتماد التغييرات نهائياً COMMIT وقارن سلوك المحرك.

تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.

مساحة التحدي

اختبر فهمك.
ووصلها للإتقان.

كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.

6أسئلة 1أنواع تحديات 100%هدف الإتقان
تصحيح تلقائي. فرص بلا حدود.

أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.

الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.

لمحة عن التحدي6 أسئلة تنتظرك
01

أي أمر SQL يفتح معاملة صريحة ويوقف الحفظ التلقائي مؤقتاً حتى انتهاء المعاملة؟

يفتح الأمر START TRANSACTION; معاملة صريحة ويعلق الحفظ التلقائي حتى إصدار COMMIT أو ROLLBACK.

02

بمجرد تنفيذ الأمر COMMIT; بنجاح، يظل بإمكانك التراجع عن التغييرات لاحقاً باستخدام الأمر ROLLBACK;.

خطأ؛ بعد نجاح الأمر COMMIT تثبت التغييرات نهائياً على القرص وتُغلق المعاملة ولا يمكن التراجع عنها بـ ROLLBACK.

03

ما الفرق الدقيق بين الأمر ROLLBACK; والأمر ROLLBACK TO SAVEPOINT sp_one;؟

يلغي ROLLBACK المعاملة بالكامل ويغلقها، بينما يلغي ROLLBACK TO SAVEPOINT الخطوات التي تلت العلامة فقط ويبقي المعاملة مفتوحة.

04

ماذا يفعل الأمر RELEASE SAVEPOINT sp_step_one; داخل المعاملة النشطة؟

يحذف العلامة المرجعية لنقطة الحفظ من الذاكرة دون التراجع عن البيانات أو إغلاق المعاملة.

05

ما رقم الخطأ الذي يُرجعه MySQL عند محاولة التراجع إلى نقطة حفظ تم تحريرها مسبقاً أو غير موجودة؟

يُظهر خادم MySQL الخطأ رقم 1305 (SAVEPOINT does not exist).

06

عند التراجع عن معاملة بالأمر ROLLBACK;، فإن الأرقام التسلسلية AUTO_INCREMENT التي وُلدت خلالها لا يُعاد تدويرها مما قد يترك فجوة رقمية طبيعية.

صواب؛ يحجز محرك InnoDB أرقام AUTO_INCREMENT بشكل مستقل لسرعة التزامن، فلا تعود للوراء عند التراجع.