ما الفرق بين ROLLBACK وROLLBACK TO SAVEPOINT؟

متقدمقراءة دقيقةآخر تحديث 3 أكتوبر 2026

SQL قواعد البيانات

الإجابة

تلغي عبارة ROLLBACK العادية تغييرات المعاملة الحالية غير المثبتة وتنهيها. أما ROLLBACK TO SAVEPOINT فتعيد المعاملة إلى نقطة حفظ سميت مسبقًا، وتلغي التغييرات التي حدثت بعد تلك النقطة مع إبقاء ما سبقها. تظل المعاملة مفتوحة بعد هذا التراجع الجزئي.

تفيد نقاط الحفظ عندما تتكون عملية العمل من مراحل، ونحتاج إلى إلغاء مرحلة لاحقة دون خسارة العمل السابق داخل المعاملة نفسها. لكن نقطة الحفظ لا تثبت التغييرات التي قبلها؛ فهذه التغييرات تظل جزءًا من المعاملة ويمكن إلغاؤها بتراجع كامل قبل تنفيذ COMMIT.

مثال

CREATE TABLE tasks (
  id INT PRIMARY KEY,
  priority INT
) ENGINE=InnoDB;
INSERT INTO tasks VALUES (1, 1);
START TRANSACTION;
UPDATE tasks SET priority = 2 WHERE id = 1;
SAVEPOINT before_extra;
UPDATE tasks SET priority = 3 WHERE id = 1;
ROLLBACK TO SAVEPOINT before_extra;
COMMIT;

يعيد التراجع الجزئي القيمة إلى اثنين، ثم يثبتها الأمر الأخير. تتطلب قراءة هذه الأمثلة تتبع موقع نقطة الحفظ بدقة، لأن اسمها لا يغير أثر الأوامر السابقة أو يجعلها مستقلة عن بقية المعاملة.

باختصار: التراجع إلى نقطة حفظ يلغي الجزء اللاحق فقط، بينما التراجع الكامل يلغي المعاملة غير المثبتة.

هل تريد تعلّم SQL خطوة بخطوة مع تمارين عملية؟ تابع مسار SQL من الأساسيات للاحتراف.

اختبر فهمك

ما قيمة priority في الاستعلام الأخير بعد التراجع الجزئي ثم متابعة المعاملة؟

CREATE TABLE tasks (
  id INT PRIMARY KEY,
  priority INT
) ENGINE=InnoDB;
INSERT INTO tasks VALUES (1, 10);
START TRANSACTION;
UPDATE tasks SET priority = priority + 5 WHERE id = 1;
SAVEPOINT s1;
UPDATE tasks SET priority = priority * 2 WHERE id = 1;
ROLLBACK TO SAVEPOINT s1;
UPDATE tasks SET priority = priority + 1 WHERE id = 1;
COMMIT;
SELECT priority FROM tasks WHERE id = 1;