الانتقال إلى المحتوى الرئيسي
الوحدة 8 · الدرس 4 من 432/57 في الدورة~10 min
دروس الوحدة (4/4)

المعاملات: كل شيء أو لا شيء

المعاملة هي مجموعة من العمليات التي تتعامل معها قاعدة البيانات وحدة واحدة: إما أن ينجحوا جميعًا، أو لا يترك أي منهم تتبع. إنها الطريقة التي تحمي بها نفسك من التناقضات عند التسلسل يجب أن يظل UPDATE/INSERT/DELETE ثابتًا.

بناء الجملة

SQL
BEGIN;             -- apri la transazione

UPDATE …;
INSERT …;
DELETE …;
SELECT …;          -- puoi anche solo leggere

COMMIT;            -- conferma tutte le modifiche
-- oppure
ROLLBACK;          -- annulla tutte le modifiche, come se nulla fosse

كل شيء بين BEGIN وCOMMIT ذري: لا يوجد اتصال آخر يرى الحالة المتوسطة. إذا تعطل البرنامج أو تم تنفيذه ROLLBACK، تظل قاعدة البيانات تمامًا كما كانت قبل BEGIN.

السيناريو الكلاسيكي: النقل

المثال المتعارف عليه هو نقل الأسهم بين المنتجات (أو الأموال التحويل بين الحسابات): اثنان UPDATEs يجب أن ينجحا معًا، أبدا واحد نعم والآخر لا.

SQL
BEGIN;
UPDATE products SET stock = stock - 1 WHERE id = 1;
UPDATE products SET stock = stock + 1 WHERE id = 2;
COMMIT;

إذا فشل UPDATE الثاني (على سبيل المثال، خطأ قيد CHECK)، ROLLBACK يعيد مخزون المنتج 1 إلى قيمته الأصلية.

ROLLBACK: مصحح أخطاء DBA

SQL
BEGIN;
UPDATE customers SET city = 'X' WHERE id = 1;
SELECT first_name, city FROM customers WHERE id = 1;   -- "vedo come è cambiato"
ROLLBACK;

نمط مفيد جدًا لتجربة UPDATE على البيانات الحقيقية: أنت قم بتشغيله، وافحص النتيجة باستخدام SELECT في نفس المعاملة، و إذا لم يقنعك، فأنت ROLLBACK — قاعدة البيانات تمامًا كما هي كان من قبل.

نقطة الحفظ: التراجع الجزئي

داخل المعاملة، يمكنك إنشاء نقاط وسيطة:

SQL
BEGIN;
UPDATE customers SET city = 'A' WHERE id = 1;
SAVEPOINT step1;
UPDATE customers SET city = 'B' WHERE id = 2;
-- mi sono accorto che il secondo UPDATE è sbagliato:
ROLLBACK TO SAVEPOINT step1;
COMMIT;     -- solo il primo UPDATE viene confermato

حمض في 30 ثانية

تضمن المعاملات خصائص ACID:

  • A tomicity - كل شيء أو لا شيء؛
  • Cتناسق — تظل القيود مستوفاة في بداية المعاملة ونهايتها؛
  • Isolation — المعاملات المتزامنة لا ترى حالات وسيطة (على "مستويات" مختلفة)؛
  • Durability — لا يتم فقدان COMMIT الناجح حتى في حالة حدوث عطل.

دورك

تمرين#sql.m8.l4.e1
المحاولات: 0جارٍ التحميل…

في معاملة واحدة: قم بإنقاص مخزون المنتج 1 بمقدار 1 وزيادة مخزون المنتج 2 بمقدار 1. افتح باستخدام BEGIN وأغلق باستخدام COMMIT.

جارٍ تحميل المحرر…
إظهار التلميح

المخزون المرجعي - 1 والمخزون + 1 في بنود SET المعنية.

الحل متاح بعد 3 من المحاولات

تمرين المراجعة

تمرين#sql.m8.l4.e2
المحاولات: 0جارٍ التحميل…

افتح معاملة، وحاول تحديث مدينة العميل بالمعرف = 1 إلى "Sperimentale"، ثم قم بإلغاء العملية باستخدام ROLLBACK. في النهاية، يجب أن تكون مدينة العميل 1 هي المدينة الأصلية ("ميلانو").

جارٍ تحميل المحرر…
إظهار التلميح

يلغي ROLLBACK كل تغيير تم إجراؤه بدءًا من BEGIN فصاعدًا.

الحل متاح بعد 3 من المحاولات