דילוג לתוכן המרכזי
מודול 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 לערכו המקורי.

חזרה: מאתר הבאגים של ה-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 - מסד הנתונים הוא בדיוק כמו זה היה קודם.

SAVEPOINT: החזרה חלקית לאחור

בתוך עסקה ניתן ליצור נקודות ביניים:

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:

  • אטומיות - הכל או כלום;
  • ** עקביות ** - אילוצים נשארים מרוצים בתחילת העסקה ובסופה;
  • Isolation - עסקאות במקביל אינן רואות מצבי ביניים (ב"רמות" שונות);
  • **עמידות **עמידה - COMMIT מוצלח אינו אובד אפילו במקרה של קריסה.

התור שלך

פעילות גופנית#sql.m8.l4.e1
ניסיונות: 0טוען...

בעסקה בודדת: הקטינו ב-1 את המלאי של מוצר 1 והגדילו ב-1 את המלאי של מוצר 2. פתחו ב-BEGIN וסגרו ב-COMMIT.

טוען עורך...
הצג רמז

מלאי ייחוס - 1 ומניה + 1 בסעיפים המתאימים SET.

הפתרון זמין לאחר 3 ניסיונות

סקירת התרגיל

פעילות גופנית#sql.m8.l4.e2
ניסיונות: 0טוען...

פתח עסקה, נסה לעדכן את עיר הלקוח עם id=1 ל-'Sperimentale', ואז בטל את הפעולה עם ROLLBACK. בסוף העיר של לקוח 1 חייבת להיות העיר המקורית ('מילאנו').

טוען עורך...
הצג רמז

ROLLBACK מבטל כל שינוי שנעשה מ-BEGIN ואילך.

הפתרון זמין לאחר 3 ניסיונות