שיעורי מודול (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 לערכו המקורי.
חזרה: מאתר הבאגים של ה-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 - מסד הנתונים הוא בדיוק כמו
זה היה קודם.
SAVEPOINT: החזרה חלקית לאחור
בתוך עסקה ניתן ליצור נקודות ביניים:
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:
- אטומיות - הכל או כלום;
- ** עקביות ** - אילוצים נשארים מרוצים בתחילת העסקה ובסופה;
- Isolation - עסקאות במקביל אינן רואות מצבי ביניים (ב"רמות" שונות);
- **עמידות **עמידה -
COMMITמוצלח אינו אובד אפילו במקרה של קריסה.
התור שלך
בעסקה בודדת: הקטינו ב-1 את המלאי של מוצר 1 והגדילו ב-1 את המלאי של מוצר 2. פתחו ב-BEGIN וסגרו ב-COMMIT.
הצג רמז
מלאי ייחוס - 1 ומניה + 1 בסעיפים המתאימים SET.
הפתרון זמין לאחר 3 ניסיונות
סקירת התרגיל
פתח עסקה, נסה לעדכן את עיר הלקוח עם id=1 ל-'Sperimentale', ואז בטל את הפעולה עם ROLLBACK. בסוף העיר של לקוח 1 חייבת להיות העיר המקורית ('מילאנו').
הצג רמז
ROLLBACK מבטל כל שינוי שנעשה מ-BEGIN ואילך.
הפתרון זמין לאחר 3 ניסיונות