תאר התרחשות בו-זמנית
תכונת ליבה של מסדי נתונים מרובי משתמשים היא בו-זמנית. התרחשות בו-זמנית משתמשת בנעילה ובחסימה כדי לאפשר לנתונים להישאר עקביים עם משתמשים רבים המעדכנים והקריאה של נתונים בו-זמנית. לדוגמה, עקב עלויות משלוח, לכל המוצרים שלנו יש עלות של $5. בו-זמנית, עקב תעריפי מטבע, לכל המוצרים יש 3% מחיר נמוך. אם עדכונים אלה מתרחשים בו-זמנית בדיוק, המחיר הסופי יהיה משתנה ועשויים להיות שגיאות רבות. באמצעות נעילה, באפשרותך להבטיח שעדכון אחד יושלם לפני שהעדכון השני יתחיל.
התרחשות בו-זמנית ברמת הטרנזקציה. טרנזקציית כתיבה יכולה לחסום טרנזקציות אחרות מעדכון ואף לקרוא את אותם נתונים. באופן שווה, טרנזקציית קריאה יכולה לחסום קוראים אחרים או אפילו כותבים מסוימים. מסיבה זו, חשוב להימנע מטרנזקציות ארוכות או עסקאות ארוכות שלא לצורך, הכוללות כמויות מופרזות של נתונים.
קיימות רמות בידוד טרנזקציות ספציפיות רבות שניתן להשתמש בהן כדי להגדיר כיצד מערכת מסד נתונים מטפלת במשתמשים מרובים. למטרות מודול זה, נבחן קטגוריות רחבות של רמת בידוד, נעילה אופטימית ונעילה פסימית.
הערה
הפרטים המלאים של נעילת טרנזקציות מעבר ל התרחשות בו-זמנית קשורים יותר לביצועים ולא רק התלויים בקוד - למרות שביצועי קוד טובים טובים יותר. עיין במדריך מעמיק בנושא נעילת טרנזקציות וניהול גירסאות שורה של SQL Server לקבלת פרטים נוספים. לקבלת מידע אודות חסימה, עיין גם בתיעוד הביצועים של SQL Server.
התרחשות בו-זמנית אופטימית
עם נעילה אופטימית, קיימת הנחה שמתרחשים כמה עדכונים מתנגשים. בתחילת הטרנזקציה, המצב ההתחלתי של הנתונים מתועד. לפני ביצוע הטרנזקציה, המצב הנוכחי מושווה למצב ההתחלתי. אם המדינות זהות, העסקה הושלמה. אם המדינות שונות, העסקה מוחזרת למצב קודם.
לדוגמה, יש לך טבלה המכילה הזמנות מכירות בשנים האחרונות. נתונים אלה מתעדכנים לעתים רחוקות, אך דוחות פועלים לעתים קרובות. על-ידי שימוש בנעילה אופטימית, עסקאות אינן חוסמיות זו את זו והמערכת פועלת ביתר יעילות. למרבה הצער, נמצאו שגיאות בשנים האחרונות ועל העדכונים לחלוף. בעוד שטרנזקציה אחת מעדכנת כל שורה, טרנזקציה אחרת מבצעת עריכה משנית בשורה בודדת בו-זמנית. מאחר ש State of the data was changed while the initial transaction was running, the whole transaction is rolled back.
בו-זמנית פסימית
עם נעילה פסימית, יש הנחה שעדכונים רבים קורים לנתונים בו-זמנית. על-ידי שימוש בנעילה, עדכון אחד בלבד יכול להתרחש בו-זמנית, וקריאת הנתונים נמנעת כאשר עדכונים מתרחשים. פעולה זו עשויה למנוע חזרה למצב קודם גדול, כפי שניתן לראות בדוגמה הקודמת, אך עשויה לגרום לחסימה מיותרת של שאילתות.
חשוב לשקול את אופי הנתונים שלך ואת השאילתות הפועלות על הנתונים בעת החלטה אם להשתמש בו-זמנית אופטימית או פסימית כדי להבטיח ביצועים מיטביים.
בידוד תמונה
קיימות חמש רמות בידוד שונות ב- SQL Server, אך במודול זה נתרכז רק READ_COMMITTED_SNAPSHOT_OFF ו- READ_COMMITTED_SNAPSHOT_ON. READ_COMMITTED_SNAPSHOT_OFF היא רמת בידוד ברירת המחדל עבור SQL Server. READ_COMMITTED_SNAPSHOT_ON היא רמת בידוד ברירת המחדל עבור מסד נתונים של Azure SQL.
READ_COMMITTED_SNAPSHOT_OFF לנעול את השורות המושפעות עד לסוף הטרנזקציה אם השאילתה משתמשת ברמת בידוד הטרנזקציה מחויבת לקריאה. על אף שמתרחשים עדכונים מסוימים, כגון יצירת שורה חדשה, הדבר ימנע את רוב השינויים המתנגשים בנתונים שנקראו או מתעדכנים. זוהי התרחשות בו-זמנית פסימית.
READ_COMMITTED_SNAPSHOT_ON מצלמת תמונה של הנתונים. לאחר מכן מתבצעים עדכונים בתמונה זו ומאפשרים לחיבורים אחרים לבצע שאילתה על הנתונים המקוריים. בסוף הטרנזקציה, המצב הנוכחי של הנתונים מושווה לתמונה. אם הנתונים זהים, הטרנזקציה מחויבת. אם הנתונים שונים, הטרנזקציה מוחזרת למצב קודם.
כדי לשנות את רמת הבידוד READ_COMMITTED_SNAPSHOT_ON את הפקודה הבאה:
ALTER DATABASE *db_name* SET READ_COMMITTED_SNAPSHOT ON;
כדי לשנות את רמת הבידוד READ_COMMITTED_SNAPSHOT_OFF את הפקודה הבאה:
ALTER DATABASE *db_name* SET READ_COMMITTED_SNAPSHOT OFF;
אם מסד הנתונים השתנה כדי להפעיל תמונה מחויבת לקריאה, כל טרנזקציה המשתמשת ברמת בידוד מחויבת לקריאה המהווה ברירת מחדל תשתמש בנעילה אופטימית.
הערה
בידוד תמונה מתרחש רק עבור טרנזקציות מחויבות לקריאה. טרנזקציות המשתמשות ברמות בידוד אחרות אינן מושפעות.