
הטקסט המלא של הדקות הראשונות בהרצאה «Read Committed / UnCommitted» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
איזוליישן לבל הוא נושא השיעור שלפנינו והשיעורים שלאחר מכן. באיזוליישן לבל אנחנו מדברים על רמת בידול שבין טרנזקציה אחת לטרנזקציה אחרת בתוך הלטאבס, אשר ברמה התיאורטית אנחנו היינו מצפים שכל טרנזקציה תהיה מבודלת לחלוטין אחת מן הרהוטה, אולם באופן מעשי על מנת למנוע נעילות אנחנו יוצרים מצב של רמות בידול שונות.
מה עם רמות הבידול ואילו בעיות הם פותרים לנו? את זאת אנחנו נראה בשיעורים הקרובים. הראייה הראשונה שאותה אנחנו רואים כבר בשקף כאן שלפנינו, הנושא של Dirty Reets.
ארבע בעיות שנגרמות או נפתרות על ידי רמות בידול שונות אנחנו נראה בשיעורים הקרובים. השיעור שלפנינו דן בנושא של Dirty Reets, קריאת נתונים מלוכלכים. ולמה הכוונה במושג הזה Dirty Reets, נתונים מלוכלכים?
קריאת נתונים שיעודכנו במהלך הטרנזקציה ועוד טרם סיומה של הטרנזקציה, כאשר הטרנזקציה עדיין לא הסתיימה על ידי קומיט ורולבק, הובעה טרנזקציה אחרת ורוצה לקרוא את הנתונים, מה היא רואה באותה רשומה.
בואו נתחבר לדאטאבס ונראה את הדוגמה שלפנינו. בדוגמה שלפנינו אנחנו מדברים על רשומה ספציפית בתוך הדאטאבס.
הרשומה הזאת מובאת לפניכם. מדובר על עובדת ננסי ואנחנו מעדכנים את עמודת נוטס. עמודת נוטס תתעדכן על ידי קונקשן מספר 1, שימו לב שפתחתי כאן שני קונקשנים שונים, אחד מצד שמאל ואחד מצד ימין, כאשר כל קונקשן בעצם מבצע פעולה טרנזקטיבית אחרת מול הדדאמס.
קונקשן ראשון, עובד מעדכן את הרשומה של עובד מספר 1, מכניס לה מחרוזת, מחרוזת רמית לחלוטין שבחרתי אותה ברגע זה, This is new string from connection 1, מעדכן את זה, אבל שימו לב מהי רמת הבידול.
רמת הבידול, כך אנחנו מציינים זאת, וזה הסינטקס של הפקודה, Transaction, תגדיר לי את הטרנזקציה, מבחינת Isolation Level, מבחינת רמת הבידול, לרמת בידול שנקראת Read Uncommited, קריאת נתונים שהם לא Committed, שהם לא אושרו מול הדאטאבייס, לא אושרו באופן סופי בעת סיום הטרנזקציה.
Read Un Committed, אגב, זוהי רמת הבידול הנמוכה ביותר, זוהי רמת בידול שאינה דורשת נעילות של הנתונים. הגם שאני מעדכן נתון, היא לא הייתה רשומה באופן אקסקלוסיבי, לא הייתה טבלה.
ולכן, בואו נראה מה קורה. תחילת טרנזקציה ראשונה נכנסת לתוך הדאטאבייס והוא מעדכן לנו את הנתונים. פתחתי כאן טרנזקציה, נתתי לה שם Update Orders.
אני מעדכן כאן את הנתון, ושימו לב, אנחנו לא סוגרים, אני לא מריץ את הקטע הזה שהוא סוגר את הטרנזקציה, אני שם רק את כל החלק העליון.
אני מריץ את הטרנזקציה, הטרנזקציה כעת בעיצומה. עדכנה לי מחרוזת חדשה בתוך נאוץ עבור עובדת מספר 1, עבור ננסי. באותה זמנית, בו זמנית, נכנסת ל-Connection אחר ומתחיל לשלוף נתונים מתוך ה-Database, שוב פעם עובד ב-Mode של Isolation Level Read Uncommitted, קורא נתונים שהם לא Committed על מנת להיות משוחרר מנעילה כזו או אחרת,
קורא את הנתונים, שולף, ושימו לב מה הוא מקבל, הוא מקבל כאן מחרוזת שעודכנה אבל טרם בוצעה בגינה Commit או Rollback, הוא קורא בעצם dirty reads, הוא קורא נתונים מלוכלכים, נתונים שעדיין עובדים עליהם, שהם עדיין חלק מטרנזקציה.
אם תבוא הטרנזקציה הקודמת, הראשונה, תחזור ותבצע rollback לנתון ותחזיר את המצב לקדמותו, יצא מצב שבעצם הרשומה, ה-connection כאן שמצד ימין שלפנינו, קראה נתונים, קראה מחרוזת שמעולם לא הייתה, לו רגע נתון אחד בקומיטד בתוך הדאטאבס.
היא קראה נתון מלוכלך, קראה נתון שגוי. אם עכשיו תבוא ותקרא אותו, אז ברור לכולנו שהיא קוראת רשומה ריקה, כפי שחזר המצב לקדמותו. אנחנו סוגרים כאן את הטרנזקציה של read orders.
אנחנו מגלים בעצם, נשלוף שוב פעם, אנחנו מגלים בעצם את הבעייתיות בעבודה במוד של read uncommitted, אתה יכול לקרוא נתונים שלא היה רגע אחד נתון שהם באמת היו בתוך הדאטה בס. אתה קורא נתונים שהטרנזקציה מעדכנת ומבצעת