في هذا الدرس 6تصفّح المواضيع
بدلاً من تعطيل متغير الجلسة 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 |
+------------+--------+---------+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 diskSTART 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 |
+------------+---------+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 |
+---------+------------+--------------+--------+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. - قاعدة قِصر زمن المعاملة: اجعل المعاملات سريعة ومباشرة، ولا تنتظر إدخال المستخدم البشري أبداً بينما المعاملة مفتوحة وتحتجز أقفال الصفوف.
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
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 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
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 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 لتتبع موضع كل معاملة معتمدة.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
مهامك قبل الاختبار
خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.
-
نفّذ جمل SQL الواردة في قسم بدء المعاملة START TRANSACTION داخل بيئة MySQL 8 المحلية وتحقق من المخرجات.
-
جرّب الحالات الثلاث داخل محاكي أوامر COMMIT و ROLLBACK و SAVEPOINT في قسم اعتماد التغييرات نهائياً COMMIT وقارن سلوك المحرك.
تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.
اختبر فهمك.
ووصلها للإتقان.
كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.
أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.
الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.
لمحة عن التحدي6 أسئلة تنتظرك +
أي أمر SQL يفتح معاملة صريحة ويوقف الحفظ التلقائي مؤقتاً حتى انتهاء المعاملة؟
يفتح الأمر START TRANSACTION; معاملة صريحة ويعلق الحفظ التلقائي حتى إصدار COMMIT أو ROLLBACK.
بمجرد تنفيذ الأمر COMMIT; بنجاح، يظل بإمكانك التراجع عن التغييرات لاحقاً باستخدام الأمر ROLLBACK;.
خطأ؛ بعد نجاح الأمر COMMIT تثبت التغييرات نهائياً على القرص وتُغلق المعاملة ولا يمكن التراجع عنها بـ ROLLBACK.
ما الفرق الدقيق بين الأمر ROLLBACK; والأمر ROLLBACK TO SAVEPOINT sp_one;؟
يلغي ROLLBACK المعاملة بالكامل ويغلقها، بينما يلغي ROLLBACK TO SAVEPOINT الخطوات التي تلت العلامة فقط ويبقي المعاملة مفتوحة.
ماذا يفعل الأمر RELEASE SAVEPOINT sp_step_one; داخل المعاملة النشطة؟
يحذف العلامة المرجعية لنقطة الحفظ من الذاكرة دون التراجع عن البيانات أو إغلاق المعاملة.
ما رقم الخطأ الذي يُرجعه MySQL عند محاولة التراجع إلى نقطة حفظ تم تحريرها مسبقاً أو غير موجودة؟
يُظهر خادم MySQL الخطأ رقم 1305 (SAVEPOINT does not exist).
عند التراجع عن معاملة بالأمر ROLLBACK;، فإن الأرقام التسلسلية AUTO_INCREMENT التي وُلدت خلالها لا يُعاد تدويرها مما قد يترك فجوة رقمية طبيعية.
صواب؛ يحجز محرك InnoDB أرقام AUTO_INCREMENT بشكل مستقل لسرعة التزامن، فلا تعود للوراء عند التراجع.