שיעורי מודול (4/4)
רמות בידוד
מעבר למפורש לעדכון, לעסקאות יש גם כללים מתמטיים מולדים שנטמו עמוק בתוך המנוע שקובעים כמה אנרגיה להשקיע בבידוד כל אינטראקציה אינדיבידואלית כברירת מחדל. זה נקרא רמת הבידוד. בעולם ה-SQL אנחנו מכירים 4 סטנדרטיים, לפי סדר כוח ובטיחות אבל ברור שההיפוך מבחינת ביצועים.
READ UNCOMMITTED:טירוף אנרכי, העסקה שלך תראה כל שינוי שנעשה על ידי אחרים כולל נתונים זמניים מאנשים באמצע הסקריפטים שלהם. אף אחד לא משתמש בו ב-DBs גדולים, בגלל שגיאות קריאה מלוכלכות קבועות.READ COMMITTED:(ברירת מחדל עבור Postgres). אתה תראה מיד נתונים חדשים ברגע שצד שלישי יוציא COMMIT, אבל אתה יכול ליפול קורבן לקריאות פנטום (לראות רשומות חדשות באמצע תהליכי העבודה הארוכים שלך) או תצוגה עקבית לא ליניארית.REPEATABLE READ:כבד יותר. במשך הפגישה הגדולה שלך עם חלון הזמן, אני "רואה" את מסד הנתונים קפוא ברגע שהשאילתה שלי התחילה, מתעלם לחלוטין ומתעלם אפילו מההתחייבויות הרשמיות שהושלמו על ידי אנשים אחרים! הוא מגן מפני רשומות המופיעות בצורה קסומה, ומבטיח יציבות.SERIALIZABLE:שכבת אלוהים (סופר איטי). מטפל בכל עסקה חופפת על ידי חסימתן וביצוען באופן סדרתי בנתיב בודד, מבטל באכזריות את אלה שמתנגשים, מבטל בשורש אפילו את האפשרות המדעית של התנגשות הקטנה ביותר, ומקריב 90% מוצק של תפוקה גבוהה.
איך מגדירים את זה?
במקום BEGIN; הרגיל אתה מקליד:
BEGIN ISOLATION LEVEL SERIALIZABLE;
-- and you proceed normally with your hermetically sealed isolation
UPDATE products SET stock = 10;
COMMIT;או בכמה גרסאות ומנועים ישנים יותר אתה מקצה אותו לאחר התנעה:
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;נסה זאת בעצמך
התחל עסקה תוך הגדרה רשמית של הרמה הגלובלית לכל החיים של השאילתה ל-REPEATABLE READ כדי ליצור בורסה קפואה ומוגנת.\nזכור שברמת השאילתה היא לא משרתת שום מטרה אלא אם כן עוקב אחריו על ידי משהו אחר, אז סגור אותה ריקה עם 'COMMIT'.
הצג רמז
פתח עם BEGIN LEVEL LEVEL REPEATABLE READ; ולסגור עם COMMIT;
הפתרון זמין לאחר 3 ניסיונות
בוא ננסה את הרמה המטורפת הניתנת לסידרה ונוסיף כמה נתונים פיקטיביים.\nפתח בלוק 'SERIALIZABLE'.\nעדכן את השם של הקטגוריה Id=2 ל-'Nuovo Nome Segreto'.\nהרץ את ההתחייבות האטומית והמסדירה הסופית.
הצג רמז
התחל רמת בידוד ניתנת לסדרה;\nעדכון קטגוריות שם SET = 'Nuovo Nome Segreto' WHERE id = 2;\nCOMMIT;
הפתרון זמין לאחר 3 ניסיונות