דילוג לתוכן המרכזי
מודול 11 · שיעור 1 מתוך 441/57 בקורס~15 min
שיעורי מודול (1/4)

עסקאות ACID (BEGIN/COMMIT)

יסודות המהימנות של כל מסד נתונים נשענים על ראשי התיבות ACID:

  • **התעללות: פעולה מסתיימת במלואה (התחייבות), או נכשלת מבלי להשאיר עקבות חצי גמורים מאחור (החזרה).
  • עקביות: כללי מסד הנתונים (למשל אילוצים, מפתחות זרים) תמיד מכובדים.
  • **התחממות: עסקאות המתרחשות בו-זמנית אינן מפריעות זו לזו בדרכים לא מבוקרות.
  • Durability: לאחר Commit, השינוי נכתב לדיסק באופן בלתי הפיך.

תחביר עסקה

בדרך כלל, כל שאילתת UPDATE או DELETE מטופלת כעסקה עצמאית (מחיקה אוטומטית). אך כאשר רוצים לקבץ מספר פעולות יחד, למשל חיוב חשבון הלקוח וביצוע ההזמנה, יש לעשות זאת במפורש באמצעות תחביר עסקה.

SQL
BEGIN;

UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
INSERT INTO orders (user_id, total) VALUES (1, 100);

COMMIT; -- Writes the changes

אם במהלך הביצועים המורכבים הללו, אפליקציית JavaScript ששלחה את השאילתה מבינה שיש בעיה (לדוגמה, אין מספיק מלאי במחסן והוא קורס), היא תשלח:

SQL
ROLLBACK; -- Cancels the changes and discards the 2 queries sent in the block

נסה זאת בעצמך

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

פתח עסקה.\nעדכן את המוצר עם מזהה 10 תוך הגדרת 'כמות' שלו ל-0 בטבלה הזמנית (לא רגע, 'כמות' לא מופיעה במוצרים, בוא נמציא: שנה את 'יחידת_מחיר' ב'order_items' אבל זה מצריך אילוץ.\nבוא נעשה יותר טוב: עדכן את הסטטוס 'שליחה' של העסקה 5 בהצלחה.

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

התחל עם BEGIN;, שנה הזמנות עבור id = 5 ל-status='shipped', ואז שלח אותו עם COMMIT;

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

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

פאניקה בהפקה! מפתח כתב MELETE ללא ה-WHERE, ומחק היסטורית את כל הביקורות.\nבוא נראה להם איך מתבצעת החזרה לאחור. התחל עסקה, הפעל DELETE מהיר שמוחק הכל מ'ביקורות' (ללא סעיף WHERE), אבל אז השתמש במציל החיים של SQL כדי לבטל את ההשפעה לפני השלמת החסימה.

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

BEGIN;, מחיקת הלוח הנקי על 'ביקורות', ולאחר מכן החזרת הקסם; בסוף.

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