PracticU

Repeatable Reads

בלי כתוביותעם כתוביות
PracticU › קורס DBA אפליקטיבי - שפת SQL למתחילים › Repeatable Reads
Repeatable Reads
השיעור עוסק ברמת הבידוד Repeatable Read, שפותרת בעיה של קריאות חוזרות בתוך אותה טרנזקציה, שמחזירות תוצאות שונות.
הבעיה: Non-Repeatable Reads
ב-Read Committed טרנזקציה קוראת נתון פעמיים. בין שתי הקריאות טרנזקציה אחרת מעדכנת את הנתון ומאשרת אותו. לכן הקריאה השנייה מחזירה ערך אחר, אף שהטרנזקציה הראשונה עדיין פתוחה.
הפתרון: Repeatable Read
- הטרנזקציה נועלת את הרשומות שקראה עד סוף הטרנזקציה.
- טרנזקציה אחרת שמנסה לעדכן את הנתון ממתינה עד שהטרנזקציה הראשונה מסתיימת.
- כל קריאה חוזרת באותה טרנזקציה מחזירה את אותו ערך.
בהדגמה הקריאה השנייה החזירה את הערך הקודם, והעדכון מהחיבור השני המתין עד שהטרנזקציה הראשונה הסתיימה.
המחיר
- יותר נעילות ויותר המתנה בין טרנזקציות.
- השיעור הבא ממשיך לרמות הבידוד הבאות.
כשנדרשת עקביות בין שתי קריאות באותה טרנזקציה, Repeatable Read מתאים, אבל הוא משלם על כך בנעילות.
השיעור הבא בקורס: serializable - transaction isolation level

פרקי ההרצאה: Repeatable Reads

  1. 00:00

    רמת Read Committed ובעיותיה

  2. 00:40

    Non-Repeatable Reads: קריאה חוזרת שונה

  3. 01:50

    עדכון מקביל מחיבור אחר

  4. 02:40

    הנתון שנקרא השתנה באותה טרנזקציה

  5. 03:17

    בעיית Lost Updates בעדכון נתונים

  6. 04:08

    שתי טרנזקציות מתחרות על אותו עדכון

תמלול ההרצאה: Repeatable Reads

הטקסט המלא של הדקות הראשונות בהרצאה «Repeatable Reads» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:20

    בשיעור הקודם ראינו כיצד התמודדות עם בעיה של Dirty Reets קריאת נתונים מלוכלכים התפתחנו אותה על ידי עבודה ב-Isolation Red Level של Read Committed אגב שזה יצר לנו נעילות אבל היינו יכולים לתת גרנטי התחייבות מלאה שכל הנתונים שייקראו על ידי המשתמשים יהיו Committed בתוך הדאטאביס אולם Read Committed אינו פותר לי את הבעיה

  2. 00:46

    כפי שאנחנו נראה בדקות הקרובות בעיה שנקראת Non-Repeatable Reets קריאת נתונים חוזרת שאינה משחזרת לי את אותו מידע, אלא מידע אחר.

  3. 00:58

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

  4. 01:10

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

  5. 01:20

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

  6. 01:43

    בואו נראה איך זה קורה, בואו נראה כיצד ב-read committed איני יכול לפתור את הבעיה הזאת אלא במעבר ל-isolation level מתקדמת. קראתי כאן את הנתון, פתחתי טרנזקציה, אני נמצא בעיצומה של הטרנזקציה Nancy Notes שלה כרגע ריק ואנחנו בעיצומה של הטרנזקציה וממש ברגעים אלו ניגש משתמש אחר וקונקשן אחר לתוך הדאגס,

  7. 02:05

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

  8. 02:32

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

  9. 02:47

    Non-repeatable reads קריאות חוזרות באותה טרנזקציה שאינן מביאות נתון זהה. בואו נסגור את הטרנזקציה ואכן נמצא לו מכאן למדים ש- Read Committed לא פותר בפניי את הבעיה של Non-Repeatable Breaks.

  10. 03:08

    איך אנחנו כן יכולים לפתור את זה? על ידי שימוש ב- Read Isolation ברמה פוריית. Lost Updates היא דוגמה נוספת לבעייתיות הנוצרת בעבודה במוד של Isolation Level של Read Committed.

  11. 03:24

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

  12. 03:50

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

  13. 04:07

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

  14. 04:25

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

לקורס המלא: קורס SQL ו‑DBA אפליקטיבי

ההרצאה הקודמת: Read Committed / UnCommitted

ההרצאה הבאה: serializable - transaction isolation level

קורסים נוספים במסלול

  • קורס NoSQL - MongoDB
  • קורס SSIS
  • קורס BI - ניתוח מסדי נתונים - Qlik Sense
  • קורס Power BI