
הטקסט המלא של הדקות הראשונות בהרצאה «Transaction Isolation Level» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
טוב חברים בהרצאה הזאת אנחנו נראה isolation Level של דאטה בייס בעצם מה זה Isolation Level בטרנזקציה הסברנו מה זה טרנזקציה עכשיו מה זה Isolation Level ולמה זה חשוב אז יש לנו כמה בעצם רמות של Isolation Level ואנחנו נדבר על הרמות האלו של Isolation Level ונדבר על איזה בעיות יש לנו מה זה Dirty
Reads ואני הולך להראות לכם מה זה Non-Repeatable Reads ומה זה Phantom עוד שנייה אתם יודעים את כל הדברים האלו התעצלתי לעשות מצגת, אז ככה אני מראה לכם ישירות בבולקיפדיה.
אז מה זה Read Uncommitted ומה זה Isolation Level? אז בואו נתחיל קודם כל עם הבעיות שיש, עם הבעיות שיש, עם הטרנזקציה, ונתחיל לפתור אותן ולראות יתרונות וחסרונות של כל שיטה.
אז קודם כל, קודם כל ככה, אנחנו מתחילים מזה שאנחנו עושים Select בבנק שלנו. אנחנו רואים שיש לנו 1000 דולר בפרקטיקי ו-100 אצל דוד, ודוד צריך לשלם לנו 100 דולר.
אז אנחנו מתחילים בעצם, דוד נכנס לבנק, מקיש להעברה של 100 דולר, ואתר האינטרנט מתחיל לעשות את כל זה. ולפני שאחרי שהוא לקח מדוד 100 דולר, אחרי שהוא לקח מדוד 100 דולר, אתם רואים, ולפני שהוא העביר את זה לפרקטיקיו, נפל החשמל. זאת אומרת, החשמל נופל פה.
פה נופל לנו החשמל באמצע הפעולה. אז בואו נראה מה קרה. התחלנו ממצב של 1,100, הורדנו לדוד 100, עוד לא הכנסנו לפרקטיקיו ונפל החשמל או התנתק כבל רשת או לא משנה מה. אתם יודעים מה?
לא קרה שום דבר. פתאום נתקע המחשב והוא תקוע עכשיו באמצע הפעולה. תחשבו שיש פה עוד איזושהי פעולה מאוד מאוד ארוכה והוא מבצע אותה.
הוא מבצע פה עוד כל מיני בדיקות שהכל בסדר. מצד אחד לקח כסף, מצד שני פה את הפעולה הזאת היא לא עושה. ובזמן שיש לנו פה את כל ההמתנה הזאת באמצע הטרנזקציה שיש לנו פה כל מיני פעולות בדיקה שהכל בסדר שפרקטיקיו מותר להעביר עליהם כסף ודברים כאלו, שהכל בסדר ויש אישור מנהל.
באמצע הטרנזקציה בא מישהו אחר ורוצה לראות כמה כסף יש, נניח לדוד בחשבון. ואני רוצה לעשות עכשיו ניו קווירי. הניו קווירי הזה פתח לי קונקשן חדש לדאטה בייס, חיבור חדש, זה אומר, יכול להיות מכשיר אחר, זה יכול להיות, ודוד בא לבדוק מהפלאפון שלו כמה כסף יש לו, ותסתכלו איזה קטע שהדאטה בייס הטבלה נעולה, זה נקרא נעול.
למה זה נעול? כי הוא באמצע טרנזקציה, אז הוא נעל ולא נותן מידע. אז עכשיו הוא מחכה, מחכה, מחכה, ואז הוא מתקשר לתמיכה הטכנית וצועק למה אני לא רואה שום דבר, וזה כל הלקוחות לא יכולים לקבל מידע.
אז מה אנחנו יכולים לעשות כדי שלקוחות יוכלו לקבל מידע? אפילו באמצע טרנזקציה, לא לחכות שטרנזקציה תסתיים. דרך אגב, אם אתם רוצים לראות, תסתכלו, אני עושה פה Vertical Tab Group, אתם רואים פה, זו השאילתה שלו שרצה, וזו הטרנזקציה שלי שעוד לא הסתיימה.
בואו נסיים אותה, אתם יודעים, דווקא נסיים אותה בכלל ברולבק, כאילו לא הצלחנו, כאילו גלגלנו לאחור. אנחנו יכולים גם לעשות ידנית, לכתוב קוד שאם משהו, משהו, משהו, אז תעשה רולבק.
זאת אומרת זה לא רק פעולה ששרת עושה אותה בעצמו אלא גם מתכנת יכול לכתוב קוד של רולבק והנה המאה דולר שלו חזרו לדוד, היה לו מאה הורדנו לו מאה ואז עכשיו עשינו רולבק הכל חזר חזרה רולבק מחזיר הכל חזרה יפה מאוד אז ראינו שזה תוקע את זה ויש לנו בעיה עם זה שזה נתקע אנחנו רוצים לשחרר את זה אז בואו נעבור ל-Isolation
Level שהוא פשוט לא עושה לנו את הבעיות האלו שזה משחרר את זה זה נקרא read uncommitted תקרא גם שורות שהם לא עשית להם קומיט מה זה קומיט זה אומר סיימת את הטרנזקציה אפילו טרנזקציה שלא הסתיימה תיתן להם לעשות read כדי ששום דבר לא ייתקע פה נכתוב את הפקודה הזאתי בsql לפי
מייקרוסופט האמת שאני לא זוכר איך כותבים את זה אז אני כתבתי בגוגל msql מייקרוסופט sql איזוליישן לבל סט, איך לקבוע איזוליישן לבל, והנה תראו את זה יופי, גוגל ממש נותן לנו פה עזרה.
אתם צריכים להבין את הלוגיקה, לא לזכור כמו תוכי את הפקודות בעל פה. הנה סט טרנזאקשן לבל, סט טרנזאקשן לבל, ואיזה אופציות יש לי. אנחנו מתחילים בראשונה read committed, read uncommitted, read uncommitted זה עדיפות.
יופי, בואו נתחיל לפני הטרנזאקציה. המנהל של הדאטה בייס אומר חבר'ה אין בעיה אני אפתור לכם את הבעיה אני אעשה איזוליישן לבל של אנקומיטד ואז ברגע שאני עושה לכם read אנקומיטד תוכלו לקרוא גם טרנזקציה שלא הסתיימה נכון אז בואו נפעיל את זה נעשה סילקט לפני נפעיל איזוליישן לבל נגיע לזה ונחכה באמצע הטרנזקציה ונראה מה קורה עכשיו כשאנחנו
בקונקשן אחר מדווייס אחר מאתקד אחר מתוכנה אחרת מנסים לגשת לאותה טבלה שימו לב הפעם, זה לא אמור להתקע. זה לא אמור להתקע. למה הוא נתקע? כנראה שהייתי צריך לעשות, בואו נעצור אותו פה למעלה.
בואו ננסה לעשות ככה. עוד פעם, פה אנחנו באמצע טרנזקציה או לא? בואו נראה. כן, אנחנו באמצע טרנזקציה, לקחנו לו 100 דולר. ובואו נראה פה.
הופה, הנה אנחנו רואים את זה. הנה אנחנו רואים שאנחנו קוראים מידע Uncommitted. יפה מאוד. זאת אומרת פה אנחנו קוראים מידע באמצע וקראנו מידע באמצע אבל אתם יודעים מי קרא את המידע הזה באמצע?
מנהל הבנק. אז המנהל הבנק אומר רגע היה לי בכל החשבונות ביחד 1100 דולר איך זה שיש עכשיו בכל החשבונות ביחד רק 1000 דולר? מישהו גנב לנו 100 דולר.
ואז הוא לא שם לב שטרנזקציה בכלל לא הסתיימה הוא קיבל מידע חלקי באמצע העבודה. אתם רואים? אחרי שהטרנזקציה הסתיימה יש 1100 דולר בבנק פשוט הוא בדיוק ביקש את המידע הזה באמצע הטרנזקציה באמצע יחידה לוגית אחת טרנזקציה זו יחידה לוגית אחת אז זאת בעיה מאוד מאוד חמורה של לבקש מידע אנקומיטד כי אתה מקבל מידע לא נכון קיבלת מידע שיש
רק 1,000 דולר בבנק במקום 1,100 דולר בבנק אבל מצד שני קיבלת מידע במיידי ולא נתקעת לחכות שהכל יסתיים אז אתם תחליטו מה חשוב לכם במערכת שלכם ולכן ברירת מחדל של המערכת זה ריט קומיטד זאת ברירת מחדל read committed אומר לקרוא רק מה שהסתיים אוקיי לא לקרוא דברים באמצע זאת אומרת שאם אני אעשה פה read committed כן ופה אני אעשה read committed זאת אומרת אני אומר לקרוא רק מה שגמור אני בעצמי באמצע
יכול לקרוא כי זה אני בעצמי אבל הוא הוא לא יכול לקרוא הבנתם זה ההבדל אני בתור אחד שעושה את הקונקשן יכול לקרוא את המידע באמצע מן הסתם הנה קראתי אותו באמצע אבל מישהו בא לגשת, אני אומר סליחה, הטרנזקציה לא גבוהה, תחכה שאני אסיים את זה.
עשינו כל מיני פעולות, ואתם יודעים מה? זה הצליח. אז העברנו לפרקטיק 100 דולר, ועשינו קומיט לטרנזקציה. ואיך שסיימנו, הוא ישר מקבל תוצאה.
הנה בבקשה, קיבלנו תוצאה שיש פה 1000 דולר. לא, יש 1100 דולר. יפה מאוד. טרנזקציה הסתיימה, בהצלחה, הכל בסדר. בואו נחזיר קצת כסף.
יודעים מה נכניס אותו למינוס אז יפה מאוד בואו נראה עוד פעם נתחיל בריד הוא במינוס 100 זה בינתיים לא רואה שהוא במינוס 100 ונסיים את זה טרנזקציה איך שסיימנו טרנזקציה הוא קיבל מידע שימו לב הוא קיבל בכלל מידע ישן כן הוא קיבל בכלל מידע ישן עוד פעם ריד והנה המידע החדש הנקודה היא שהוא לא ראה את המצב בעיניים זה הקטע של ריד קומיטט שלא רואים את המצב בעיניים הלאה אחרון זה לא אחרון
ריפיטאבל רידס בשביל להבין מה זה ריפיטאבל רידס אנחנו צריכים קצת להסתבך ריפיטאבל רידס זה לבל הבא ולמה בכלל צריך אותו דרך אגב יש לכם פה הסברים באתר של מייקרוסופט ו-MSDN לכל מה שאתם רוצים יש כן אז מה זה ריפיטאבל רידס ריפיטאבל רידס בא לפתור לנו בעיה דרך אגב מה שקומיטד ואנקומיטד דיברנו זה בעיה של דיורטי רידס דיורטי רידס שדיברנו עליהם לפני כן זה כשאתה קורא מידע באמצע הפעולה באמצע הטרנזקציה פתאום אתה מקבל מידע חלקי
כי אתה לא יודע שהוא נמצא בטרנזקציה, אז זה נקרא דירוטי ריט. אז ראינו שבעצם Uncommitted מאפשר דירוטי ריט, וCommitted לא מאפשר דירוטי ריט, והנה זה מה שכתוב פה, שמי ה-Q.
מה זה Non-Repeatable RIT? Non-Repeatable RIT זה אומר שאני קורא מידע באמצע הטרנזקציה, ואני מקבל מידע שונה בכל קריאה. נכון שזה נשמע לכם מוזר? מה זאת אומרת? אני עושה קריאה שוב ושוב לאותו דבר, מקבל מידע שונה שימו לב נניח שאני אעשה סלקט פה זאת הפעולה הארוכה הרבה נקודה זה פעולה ארוכה ואני אעשה סלקט פה לגיטימי לגיטימי ואני
נמצא במצב של קומיטט כן שאף אחד לא יכול להיכנס לי באמצע ולקרוא לי מידע באמצע יפה אתם יודעים מה אני אעשה את זה בלי לעשות update בלי לעשות update אני אעשה את זה בהתחלה כמו שאני עושה את זה בהתחלה אני עושה את זה בהתחלה עושה איזשהו read מהבנק לא משנה איזשהו מידע עושה כל מיני בדיקות,
עושה עוד פעם ריד. בגלל שאני באותה טרנזקציה, באותה יחידה לוגית, אני מצפה שבשני המקרים הוא ייתן לי אותה תוצאה, נכון?
נכון? כמו, אתם מבינים, כן? ששני המקרים יהיו אותו דבר? שדוד במינוס 100 ופרטי קיו בפלוס 1200. יפה. אבל, הכל התחיל כמו שדיברנו, אנחנו ב-commited, התחלנו טרנזקציה, עוד לא עשינו update לשום דבר, רק התחלנו טרנזקציה ונתקלנו בפעולה ארוכה הזאת.
בא מישהו ותוך כדי בכלל עושה פעולה של Update והוא בכלל מפקיד כסף. הוא מפקיד כסף בחשבון של פרקטיקיו. בחשבון של פרקטיקיו עכשיו עושים הפקדה של כסף.
בזמן שהטרנזקציה פה עושה כל מיני בדיקות, היא עשתה קריאה, קיבלה את המידע. עכשיו היא עושה כל מיני בדיקות ומצפה שבקריאה הבאה גם היא תקבל בדיוק אותו מידע.
היא מבחינתה נמצאת בטרנזקציה ביחידה לוגית אחת בינתיים עד שהיא עושה בדיקות במקרה בא מישהו הפקיד כסף בבנק אז אנחנו באים ומפקידים כסף בבנק יופי בואו נעשה את זה F5 הנה one rule effected קיבלנו חדש של כסף בבנק ואנחנו רואים שבפרקטיקו יש 1300 ואצל דוד מינוס 100 שימו לב שיניתי את המידע של הטבלת בנק בין הסילקט הזה בזמן הטרנזקציה אנחנו באמצע
טרנזקציה לבין הסילקט הזה תסתכלו עכשיו עכשיו הוא קורא את זה והוא מקבל עכשיו 1300 ומינוס 100. מבינים שיש פה בעיה או שלא הבנתם שיש פה בעיה למה כי הוא קרה בהתחלה היה לו 1200 קרה אחרי כמה דקות והוא באמצע טרנזקציה יש לו 1300. תחשבו שזה איזשהו מידע רגיש וזה נורא חשוב כמה כסף יש בחשבון הבנק או שזה לא יכול להיות בנק זה יכול להיות גם
פצצת אטום שמתפוצצת לפני הזמן כן, לפני שהמטוס טס או מישהו עם לא יודע, עם מניות בבורסה קרה משהו. אתם מבינים שהמידע הוא יכול להיות מאוד רגיש, זה לאו דווקא משחקים בגילו כאלו.
אז יפה, זאת אומרת שאנחנו באמצע טרנזקציה עשינו סלקט ועשינו סלקט וקיבלנו מידע שונה. דרך אגב, למה פה הסלקט עכשיו נותן למרות שאני באמצע טרנזקציה, אני עדיין באמצע טרנזקציה בצד שמאל, למה הסלקט נותן לי?
כי לא נגעתי בטבלה. כאילו ברגע שאני נוגע באיזושהי טבלה, נעשה update. נניח שהוא גם פה יש לו, הוא מתעכב, הוא מחכה עכשיו פה, כן? עכשיו פה, פה. כרגע אנחנו תקועים פה בשלב הזה.
אני עכשיו לא יכול לעשות סלנט. זאת אומרת, ברגע שהטרנזקציה נוגעת באיזושהי טבלה, היא ננעלת לי, אוקיי? היא ננעלת לי, השורות שלה ננעלות לי, אוקיי?
לקריאה. שורה שנגענו בשורה מסוימת, היא ננעלה לי. אז בגלל זה העברתי את ה-select למעלה, כי אחרת לא הייתי יכול לעשות פעולות כי הוא היה נועל לי.
נכנסתי לטרנזקציה, לפני שעשיתי איזשהו Update עשיתי Select ועוד Select, וביניהם המידע השתנה, וזאת בעיה.
בגלל שזאת בעיה, יש לנו Isolation Level שנועל את הכל, כן? גם טבלה שעשית ל-Read בלבד לפני שעשית Write. דרך אגב, בואו נעשה פה, אנחנו באמצע טרנזקציה, לא?
באמצע טרנזקציה, יופי. הנה, חזרנו ל-1300 ו-100. שימו לב יש לנו פה שתי בעיות: אחת שקריאות חוזרות ונשנות הן לא אותו דבר למרות שאני בתוך הטרנזקציה זה נקרא non-repeatable reads.
repeatable reads הם לא אותו דבר זאת הבעיה הראשונה ואנחנו עושים את זה על ידי repeatable read עולים לרמה הרמה הזאת היא בניגוד לרמה הקודמת נועלת לא רק בזמן ה-update אלא גם בזמן read זאת אומרת איך שעושים read היא נועלת repeatable read.
רואים, הנה repeatable read, אם אני כותב פה isolation level של repeatable read, אם אני עובר ל-Isolation level של repeatable read בתוכנות שלי, אז מה שקורה שהדאטה בייס ננעל אפילו בפעולת read.
תסתכלו מה קורה בין read הזה ל-read הזה, אתם רואים, עכשיו אני נתקעתי כאן, כאילו זה משהו הרבה זמן, בינתיים מתבצע update. שימו לב, update נתקע, לפני כן הוא לא היה נתקע.
למה? כי ה-level של repeatable read, מה שהוא עושה, הוא נעל את הטבלה אפילו בסלקט, הוא לא חיכה לאבדייט בשביל לנעול אותה, הוא כבר בסלקט נעל אותה.
וזה ההבדל הגדול בין ה-level של read committed הדפולטים, רק מרדל זה read committed ל-repeatable read, כן?
או שכמו שאנחנו רואים את זה, זה ההבדל הגדול בין read committed שזה הדפולט, שהיה נועל רק בזמן האבדייט את הטבלה, את השורה יותר נכון. לעומת זאת repeatable read שכבר בסלקט הוא נועל כדי שלא יווצר מצב ששני סלקטים הם לא טובים.
הנעילה של repeatable read היא מצוינת, פתעה לנו את הבעיה של הסלקטים, אבל יש לנו בעיה אחרונה שנקראת פאנטום. מה זה פאנטום? שימו לב למשהו.
נכון, אנחנו באמצע טרנזקציה. אנחנו באמצע טרנזקציה, עושים פה כל מיני בדיקות. כן, הטרנזקציה לא הסתיימה, ה-update פה לא מצליח, ה-update נתקע.
אבל אנחנו עושים משהו חדש, שימו לב מה אנחנו עושים. אנחנו ניקח את זה, נעביר את זה לפה, נפתח פה עוד סשן, פתחנו עוד סשן, תוך כדי הסשן האפדייט פה תקוע, מצוין שתהיה תקוע.
פתאום אני עושה פה בכלל אינסרט. הגיע בן אדם חדש. הגיע בן אדם חדש לבנק, אינסרט בנק, בסוגריים name.mymoney, כן, זה עמודות שצריך לספק, מיימני, ואיזה values.
הגיע בן אדם שקוראים לו,