دروس الوحدة (4/4)
المعاملات: كل شيء أو لا شيء
المعاملة هي مجموعة من العمليات التي تتعامل معها قاعدة البيانات
وحدة واحدة: إما أن ينجحوا جميعًا، أو لا يترك أي منهم
تتبع. إنها الطريقة التي تحمي بها نفسك من التناقضات عند التسلسل
يجب أن يظل UPDATE/INSERT/DELETE ثابتًا.
بناء الجملة
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 يجب أن ينجحا معًا،
أبدا واحد نعم والآخر لا.
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
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 — قاعدة البيانات تمامًا كما هي
كان من قبل.
نقطة الحفظ: التراجع الجزئي
داخل المعاملة، يمكنك إنشاء نقاط وسيطة:
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الناجح حتى في حالة حدوث عطل.
دورك
في معاملة واحدة: قم بإنقاص مخزون المنتج 1 بمقدار 1 وزيادة مخزون المنتج 2 بمقدار 1. افتح باستخدام BEGIN وأغلق باستخدام COMMIT.
إظهار التلميح
المخزون المرجعي - 1 والمخزون + 1 في بنود SET المعنية.
الحل متاح بعد 3 من المحاولات
تمرين المراجعة
افتح معاملة، وحاول تحديث مدينة العميل بالمعرف = 1 إلى "Sperimentale"، ثم قم بإلغاء العملية باستخدام ROLLBACK. في النهاية، يجب أن تكون مدينة العميل 1 هي المدينة الأصلية ("ميلانو").
إظهار التلميح
يلغي ROLLBACK كل تغيير تم إجراؤه بدءًا من BEGIN فصاعدًا.
الحل متاح بعد 3 من المحاولات