Transaction Isolation Level

‏ • 31 בינואר, 2004

כאשר מבצעים טראנסאקציה, נועלים את הרשומות, שמשתתפות בטראנסאקציה, עד לסיום הטראנסאקציות.  ישנם מספר סוגים של נעילות, אבל לצורך ההסבר נדבר רק על 2 סוגים:
Shared lock – כל ביצוע קריאה של נתונים ע"י משפט select שם נעילה מסוג shared lock על אותם רשומות.  אין הגבלה על כמות הshared lock על רשומה, כך שמספר משתמשים יכולים לקרוא את אותה רשומה בו זמנית.


Exclusive lock – כל שינוי של הנתונים (update, insert, delete) חייבים לקבל exclusive lock על הרשומות, שמשנים.  ברגע שיש על רשומה exclusive lock אחד, לא ניתן לשים על הרשומה שם נעילה נוספת (כולל shared lock), ורק הprocess, שנעל את הרשומה, יכול לעבוד עם הרשומה. הנעילה משתחררת בסיום הטראנסאקציה.


Isolation level מגדיר את סוג הנעילות וטווח הנעילות.  SQL Server עובד עם הIsolation levels הבאים:
1) Read uncomitted – פעולת הקריאה, לא שמה על הרשומות shared locks.  בנוסף ניתן לקרוא כל רשומה גם אם יש עליה exclusive lock.  יכולה להיות לך בעיה, שאתה קורה ערך חדש ברשומה, לפני ביצוע הcommit.  אם במקום commit מתבצע rollback, אז פעולת הselect שלך קיבלה נתון, שלא נמצא בתוך בסיס הנתונים.


2) Read commited – זה הisolation level של ברירת המחדל.  כל נעילות exclusive בתוך טראנסאקציות נשארות עד לסיום הטראנסאקציות.  shared locks בתוך טראנסאקציות משתחרורת עוד בתוך הטראנסאקציה לאחר קריאת הרשומות הרלוונטיות.  במידה ויש לי Stored Procedure עם הקוד הבא:



begin trans
    Select SomCol FROM TableA WHERE AnotherCol='WhatEver'
    Update table b…
commit trans



הנעילות על הרשומות בTableA משתחררות כבר במשפט הupdate על tableB ולא כאשר הסתימה הטראנסאקציה


3) Repeatable read – בIsolation level הזה, כל הshared locks נשארים עד לסיום הטראנסאקציה.  בדוגמא, שכתבתי מקודם הנעילות על TableA יישארו עד לסיום הטראנסאקציה.  אם במהלך הטראנסאקציה ביצעתי את אותו משפט select פעם נוספת, אני אקבל את הרשומות שקיבלתי בפעם הקודמת.  ובכל הרשומות יהיו בדיוק את אותם הערכים, שהיו בselect הראשון.  יכול להיות, שאני אקבל גם רשומות נוספות, כי בין 2 פעולות הselect על הטבלה, process אחר יכל לבצע פעולת insert לטבלה עם ערכים, שעונים לקריטריונים של משפט הselect (או לבצע פעולת update על רשומה קיימת, כך שגם היא תענה לקריטריונים של פעולת הselect).


4 Serializable – מובטח לי תמיד לקבל בדיוק את אותם תוצאות במשפטי select בתוך טראנסאקציות.  כל סוגי הנעילות על כל הרשומות בטראנסאקציה נשמרות על לסיום הטראנסאקציה (כמו בRepeatable read), אבל נוספות נעילות אחרות, שמונעות מprocess אחר להוסיף רשומות לטבלה, שעליה ביצעתי select, שעומדות בקריטריונים של משפט הselect (בדוגמא שנתתי קודם משתמשים אחרים לא יכולים להוסיף לTableA רשומה, שבה הערך של AnotherCol יהיה WhatEver.  לעומת זאת process אחר יכול להוסיף רשומה לטבלה שבה לשדה AnotherCol יש ערך שונה מWhatEver).


 

תגיות: , , , , ,

תגובות בפייסבוק