
הטקסט המלא של הדקות הראשונות בהרצאה «Repeatable Reads» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
בשיעור הקודם ראינו כיצד התמודדות עם בעיה של Dirty Reets קריאת נתונים מלוכלכים התפתחנו אותה על ידי עבודה ב-Isolation Red Level של Read Committed אגב שזה יצר לנו נעילות אבל היינו יכולים לתת גרנטי התחייבות מלאה שכל הנתונים שייקראו על ידי המשתמשים יהיו Committed בתוך הדאטאביס אולם Read Committed אינו פותר לי את הבעיה
כפי שאנחנו נראה בדקות הקרובות בעיה שנקראת Non-Repeatable Reets קריאת נתונים חוזרת שאינה משחזרת לי את אותו מידע, אלא מידע אחר.
בדוגמה הזאת אנחנו ראשית קוראים נתונים מתוך הדרגת read committed. אני פותח טרנזקציה לקריאה בלבד הפעם. אני רוצה לקרוא נתונים, אבל שימו לב, בתוך הטרנזקציה אני קורא את הנתונים פעמיים.
ראשית, אני קורא אותם בתחילת הטרנזקציה. כנראה כאן באיזשהו מקום אנחנו מבצעים אוסף של פעולות שונות ומשונות.
כך וכך מתבצע בתוך הטרנזקציה. ולאחר מכן אני קורא בדיוק את אותו סלקט, אני מבצע את אותו סלקט שנית מתוך הדאטה ביס. כשהשאיפה שלי, מאחר ושני הסלקטים הללו חתומים תחת אותה טרנזקציה, שאותו מידע שיישלף לי הן בשורה 11 והן בשורה 22 כפי שאנחנו רואים אותם כאן, יהיה בדיוק זהה לחלוטין.
בואו נראה איך זה קורה, בואו נראה כיצד ב-read committed איני יכול לפתור את הבעיה הזאת אלא במעבר ל-isolation level מתקדמת. קראתי כאן את הנתון, פתחתי טרנזקציה, אני נמצא בעיצומה של הטרנזקציה Nancy Notes שלה כרגע ריק ואנחנו בעיצומה של הטרנזקציה וממש ברגעים אלו ניגש משתמש אחר וקונקשן אחר לתוך הדאגס,
שוב בריט קומטד, הפעם מבצע עדכון Update לתוך הדאגס, מעדכן New Notes for Nancy מעדכן את הנתון וסוגר את הטרנזקציה סגירת הטרנזקציה מסתיימת בהצלחה כעת יש בתוך Nancy את הנתון New Notes for Nancy הטרנזקציה הראשונה שלנו ממשיכה ומתקדמת ושוב פעם שולפת את הנתונים תוך הנחה שהיא תמשיך לקבל את אותו נתון שהיא ציוותה, שהיא קיבלה
אותו בהתחלה של no work. היא שולפת כרגע את הנתונים, אני שולף אותם והפעם אני מקבל מחוזת אחרת לחלוטין. אותה טרנזקציה, אותה שליפות של סלקט של אותה רשומה נותנים לי מידע אחר.
Non-repeatable reads קריאות חוזרות באותה טרנזקציה שאינן מביאות נתון זהה. בואו נסגור את הטרנזקציה ואכן נמצא לו מכאן למדים ש- Read Committed לא פותר בפניי את הבעיה של Non-Repeatable Breaks.
איך אנחנו כן יכולים לפתור את זה? על ידי שימוש ב- Read Isolation ברמה פוריית. Lost Updates היא דוגמה נוספת לבעייתיות הנוצרת בעבודה במוד של Isolation Level של Read Committed.
שימו לב לדוגמה הבאה אני פותח כאן טרנזקציה של Read קומיטד, הטרנזקציה עצמה מבצעת עדכון בתוך הדאטאבייס, עדכון של הרשומה שאנחנו כבר מכירים אותה של מנסי בתוך סבלאפים אוטוביז, אולם לצד העדכון מתבצע באופן הבא, ראשית אנחנו שולפים את הנוטס, יש לנו כאן איזושהי המתנה של 15 שניות ולאחר מכן לאותו נוטס ששלפנו אותו מתוך הדאטאבייס בצורה נכונה על
ידי פקודת סלקט, אנחנו משרשרים פלוס שווה מכרוזת נוספת ורק לאחר מכן אנחנו מעדכנים אותו בתוך הדאטה בס. שימו לב, טרנזקציה אחת ששלפה נתון, שרשרה לו מחרוזת מסוימת ולאחר מכן מעדכנת אותו בתוך הדאטה בס.
במהלך ביצוע הטרנזקציה הזאת נכנסת לתמונה טרנזקציה אחרת, או טרנזקציה שנמצאת מצד ימין, טרנזקציה מספר 2. טרנזקציה זו עושה בדיוק את אותם דברים, שולפת נתון, משרשרת לו מידע ומעדכנת אותו בזריזות בתוך הדאטה בס וסוגרת את העדכון.
עצמו סגור וננעל בתוך הדאטאבס ביצעתי קומיט רק לאחר ביצוע הקומיט של הטרנזקציה מצד ימין גוזרת ומתעוררת הטרנזקציה מצד שמאל שנכנסה להשהייה ומאשרת את הנתון מבצעת update וקומיט לטרנזקציה איזו מידע יישמר לנו האם יישמר לנו המחווזת המקורית שהייתה אצל ננסי בעבור נוטס שמא אנחנו