Smart-World Surf

יחידה 8: ניהול טרנזקציות

הבנת מושג הטרנזקציה, תכונות ACID ומצבי טרנזקציות.

ברוכים הבאים לשיעור בנושא ניהול טרנזקציות, יחידה קריטית בקורס "מערכות נתונים - טכנולוגיות ואלגוריתמים" (20574). יחידה זו עוסקת באחד מעמודי התווך של אמינות ויציבות מסדי נתונים: הבנת מושג הטרנזקציה, תכונותיה המרכזיות (ACID) ומצבי חייה השונים. שליטה בחומר זה חיונית הן להבנה תיאורטית והן ליישומים מעשיים במערכות מידע מודרניות, והיא מהווה בסיס לשאלות רבות במבחן.

מהי טרנזקציה?

בעולם מסדי הנתונים, טרנזקציה היא יחידת עבודה לוגית אחת המבצעת סדרה של פעולות על הנתונים. המטרה העיקרית של טרנזקציה היא להבטיח שהנתונים במסד יישארו עקביים ואמינים, גם במקרה של כשלים או פעולות מקבילות.

טרנזקציה (Transaction): רצף של פעולות (קריאה, כתיבה, עדכון, מחיקה) המבוצעות על מסד נתונים, הנחשבות כיחידת עבודה אטומית אחת. כל הפעולות בטרנזקציה חייבות להתבצע בהצלחה (Commit) או שאף אחת מהן לא תתבצע (Rollback).

לדוגמה, העברת כסף מחשבון אחד לחשבון אחר בבנק היא טרנזקציה. היא כוללת הפחתה מחשבון המקור והוספה לחשבון היעד. אם רק חלק מהפעולות יתבצעו, ייווצר מצב לא עקבי במסד הנתונים.

תכונות ACID – עמוד התווך של אמינות מסדי נתונים

כדי להבטיח את שלמות הנתונים ואמינותם, כל טרנזקציה במערכת מסד נתונים יחסית צריכה לקיים ארבע תכונות מהותיות, המוכרות בראשי התיבות ACID:

אטומיות (Atomicity)

טרנזקציה היא יחידת עבודה "הכל או לא כלום". או שכל הפעולות בתוכה מתבצעות בהצלחה, או שאף אחת מהן לא מתבצעת. אין מצב ביניים. אם הטרנזקציה נכשלת, המערכת חוזרת למצב שהיה לפני תחילתה (Rollback).

עקביות (Consistency)

טרנזקציה מובילה את מסד הנתונים ממצב עקבי אחד למצב עקבי אחר. היא חייבת לשמור על כללי העקביות והאילוצים המוגדרים במסד (לדוגמה, סכום הכסף בחשבונות הבנק לא יכול להשתנות כתוצאה מהעברה). אם טרנזקציה מנסה להפר כלל עקביות, היא תיכשל ותבוטל.

בידוד (Isolation)

טרנזקציות רבות יכולות לרוץ במקביל. תכונת הבידוד מבטיחה שכל טרנזקציה תראה את מסד הנתונים כאילו היא הטרנזקציה היחידה הפועלת בו. פעולות של טרנזקציה אחת אינן גלויות לטרנזקציות אחרות עד שהיא מסתיימת בהצלחה (Commit). זה מונע בעיות כמו קריאות מלוכלכות (Dirty Reads).

עמידות (Durability)

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

תכונות ACID – חשיבות למבחן: הבנה מעמיקה של כל אחת מתכונות ACID היא קריטית. שאלות נפוצות במבחן כוללות הגדרה של כל תכונה, הסבר מדוע היא חשובה, וניתוח תרחישים בהם תכונה זו עלולה להיפגע או כיצד היא מיושמת. שימו לב במיוחד להבדלים בין בידוד לעקביות ולאופן שבו אטומיות ועמידות משלימות זו את זו.

מצבי טרנזקציה ומחזור החיים שלה

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

פעילה (Active)

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

מאושרת חלקית (Partially Committed)

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

נכשלה (Failed)

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

בוטלה/נסוגה (Aborted)

הטרנזקציה בוטלה וכל שינוייה בוטלו (Rollback). מסד הנתונים חזר למצב שהיה לפני תחילת הטרנזקציה. טרנזקציה שבוטלה יכולה להתחיל מחדש או להיפטר.

מאושרת (Committed)

הטרנזקציה סיימה את כל פעולותיה בהצלחה, וכל השינויים שהיא ביצעה נשמרו לצמיתות במסד הנתונים. כעת הם גלויים לטרנזקציות אחרות ומוגנים מפני כשלים.

שאלות לדיון

  • הסבר מדוע תכונת הבידוד (Isolation) קריטית במערכות מסדי נתונים מרובות משתמשים. תן דוגמה לבעיה שיכולה להתרחש בהיעדר בידוד מספק.
  • כיצד תכונת העמידות (Durability) מיושמת בפועל במערכות מסדי נתונים, ומה תפקיד יומן הטרנזקציות (Transaction Log) ביישום זה?
  • תאר את מחזור החיים של טרנזקציה, החל ממצב "פעילה" ועד למצב "מאושרת" או "בוטלה". ציין אירועים אפשריים בכל מעבר מצב.
  • האם טרנזקציה יכולה להפר את תכונת העקביות (Consistency) מבלי להפר את תכונת האטומיות (Atomicity)? הסבר.

נקודות לתשובת מודל

עבור השאלה: "הסבר מדוע תכונת הבידוד (Isolation) קריטית במערכות מסדי נתונים מרובות משתמשים. תן דוגמה לבעיה שיכולה להתרחש בהיעדר בידוד מספק."

  • הגדרה: בידוד מבטיח שטרנזקציות הפועלות במקביל לא ישפיעו זו על זו, וכל אחת תראה את מסד הנתונים כאילו היא פועלת לבדה.
  • חשיבות: במערכות מרובות משתמשים, טרנזקציות רבות רצות בו זמנית. ללא בידוד, הן עלולות לקרוא נתונים לא מעודכנים, לשנות נתונים שטרנזקציה אחרת עדיין עובדת עליהם, או ליצור מצבים לא עקביים.
  • מניעת בעיות: מונע בעיות כמו:
    • קריאה מלוכלכת (Dirty Read): טרנזקציה קוראת נתונים שטרנזקציה אחרת שינתה, אך טרם אישרה (Committed). אם הטרנזקציה השנייה תיכשל ותבטל את שינוייה, הנתונים שנקראו יהיו שגויים.
    • קריאה לא חוזרת (Non-Repeatable Read): טרנזקציה קוראת נתון מסוים פעמיים, ובין הקריאות טרנזקציה אחרת משנה את הנתון ומאשרת את השינוי, כך שהקריאה השנייה מחזירה ערך שונה.
    • קריאת רפאים (Phantom Read): טרנזקציה מבצעת שאילתה שמחזירה סט רשומות, ולאחר מכן טרנזקציה אחרת מוסיפה רשומות חדשות העונות לקריטריוני השאילתה. כאשר הטרנזקציה הראשונה מבצעת את אותה שאילתה שוב, היא מקבלת סט רשומות גדול יותר.
  • דוגמה: שני משתמשים מנסים למשוך כסף מאותו חשבון בו זמנית. ללא בידוד, שניהם עלולים לקרוא את אותו יתרה, לאשר את המשיכה, ולגרום ליתרה שלילית או למשיכה כפולה של כסף שאינו קיים. בידוד מבטיח שרק משיכה אחת תעובד בכל רגע נתון, או שהמערכת תטפל בהן בסדר מסוים.
מצאתם טעות או שחסר משהו?
→ הקודמת
עיבוד שאילתות ואופטימיזציה
הבאה ←
בקרת מקביליות