
BEGIN TRAN (או BEGIN TRANSACTION) ונסגרת ב-COMMIT לאישור, או ב-ROLLBACK לביטול כל הפעולות. ב-SSMS אפשר להדליק את האפשרות SET IMPLICIT_TRANSACTIONS בהגדרות Query Execution, ואז כל פקודת DML דורשת סגירה ידנית. ברירת המחדל היא שהאפשרות כבויה, ולכן כל פקודת DML נפתחת ונסגרת לבד.הטקסט המלא של הדקות הראשונות בהרצאה «מאפייני טרנזקציה - ACID» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
ברוכים הבאים לשיעור נוסף בנושא של SQL. בשיעורנו היום אנחנו נעסוק בנושא של טרנזקציות. נושא זה ילווה אותנו בשיעור זה ובשיעורים שלאחר מכן.
בשיעור אנחנו נלמד כיצד אנחנו יוצרים טרנזקציות, כיצד אנחנו מנהלים טרנזקציות בתוך הדאטאבייס, כיצד אנחנו שולפים מידע בגין טרנזקציות בתוך הדאטאבייס, כיצד אנחנו מבדלים טרנזקציות זו מזו.
כל זאת ועוד בשיעור הזה ובשיעורים שלאחר מכן. ראשית הגדרה מהי טרנזקציה ובכן טרנזקציה זו יחידה לוגית הכוללת מספר פקודות dml אשר בגינן תתבצע סגירה או בכישלון או בהצלחה רצונו לומר כל טרנזקציה זו יחידה אטומית אחת שלא ניתן לפרק אותה לתת חלקים אם אנחנו מסכמים את כל התכונות של טרנזקציה נהוג להשתמש במינוח ACID אשר כל אחת מן האותיות מציינת תכונה
אחרת של דאטאבס A-atomicity זו התכונה שעליה דיברנו היכולת האטומית של כל טרנזקציה לומר לי שאו שהכל יצליח או שהכל ייכשל אין כאן הצלחה לחלקים. חוץ מזה יש לנו גם consistency עקביות טרנזקציה אמורה לשמור לי על כל אוסף החוקים שנמצאים בתוך הדאטאבס.
אותם חוקים שהיו בתחילת הטרנזקציה יישמרו אף לאחר הטרנזקציה. לא ייתכן מצב שבו טרנזקציה תעביר אותי ממצב קונסיסטנטי אחד ממצב שבו יש אוסף של חוקיות של קונסטרנטי מסוים למצב אחר.
טרנזקציה שומרת על החוקיות ועל העקביות בתוך הדאטאבייס. טרנזקציה, לא רק מול הדאטאבייס אלא במערכת הקשרים שלה מול טרנזקציה אחרת, היא isolation, היא נבדלת, ישנו בידול בין טרנזקציה אחת לטרנזקציה אחרת, זו לא רואה את המידע של זו כל עוד היא לא
הסתיימה. טרנזקציה אינה מאפשרת ראייה של הנתונים על ידי טרנזקציה אחרת, אלא אם כן היא הסתיימה. Once הטרנזקציה הסתיימה, הנתונים משתקפים לכלל המשתמשים, אולם במהלך הטרנזקציה עצמה הנתונים בלתי ניתנים להיראות החוצה.
אנחנו עוד נראה רמות שונות של Isolation Level איך אנחנו משתמשים בנתון הזה. ריישל לבט זה הבידול והתכונה האחרונה, אנחנו מדברים על דיורביליטי, עקביות, טרנזקציה, וזו התכונה החשובה ביותר בתוך טרנזקציה, שוואנס טרנזקציה הסתיימה, לא משנה אם הייתה נפילה, קראש של הדאטאבייס,
קריסה של הנתונים, טרנזקציה ברגע שהיא הסתיימה, אני מובטח לי שכל הנתונים עודכנו נכון בתוך הדאטאבייס, הנתונים נשמרו נכון, וכאשר אני קיבלתי אינדיקציה, האינדיקציה הזאת כיצד אנחנו פותחים טרנזקציה ובכן אנחנו משתמשים במילה השמורה בגין ולאחר מכן טראן.
טראן זה קיצור של המילה טרנזקציה יש לנו גם אפשרות לציין את המילה במלואה טראן זקשן כך אנחנו פותחים טרנזקציה ובתוך כך אנחנו מציינים את אוסף הפקודות שנמצאות בתוך הטרנזקציה שזה יכול להיות פקודת dml אחת פקודת dml יצירת טבלה וכולי וכולי ובסופו של דבר סגירת הטרנזקציה באופן די מפתיע
לא מסתיימת במילה end התואמת לחברתה בגין אלא מסתיימת באחת מני שתי צורות או commit דהיינו סגור את הטרנזקציה בהצלחה אוקיי או לחלופין rollback. rollback רצונו לומר כל הפקודות שהיו במהלך הטרנזקציה הזאת ייכשלו והדאטאבס יחזור לאותו מצב קונסיסטנטי שהוא היה לפני תחילת הטרנזקציה.
כל הטרנזקציה הזאת זו יחידה לוגית אחת שלא ניתן לפרק אותה לחלקים. בתוך היחידה הזאת אנחנו רושמים את כל שאר הפקודות. שימו לב שבשעה שאנחנו רושמים פקודת DML בתוך הדאטאבס, אוטומטית נפתחת לי טרנזקציה והיא נסגרת, אני לא צריך לבצע את הקומיט או את הרולבוט.
מדוע? בואו נרוץ כאן לתוך התפריט Tools Options, ובתוך אופשיינס יש לנו את האפשרות להיכנס ל-query execution, אם אני פותח את ה-query execution, set implicit transaction, כלומר ברגע שהאפשרות הזאת by default היא לא מסומנת, כל פעולת dml,
פעולת עדכון בתוך ה-database, פותחת טרנזקציה וסוגרת אותה. לעומת זאת, אם אני אדליק את זה, כל פעולה כזאת תידרש ממני לסגור את הטרנזקציה באופן עצמאי, ולא תיתן לי אפשרות לעדכן את זה.
אנחנו נשאיר את האפשרות הזאת מכובדת ומתקדמים לדוגמה הבאה שלנו. בדוגמה הבאה שבה רשמתי לפניכם אנחנו פתחנו כאן טרנזקציה, ובתוך הטרנזקציה אני רשמתי שתי פעולות DML.
פעולה אחת מעדכנת רשומה בתוך טבלת אמגלואיז, כאשר הפעולה השנייה מעדכנת רשומה אחרת בתוך טבלת פרודקטס. שתי פקודות שאינן קשורות זו לזו, אולם חברו להיות יחידה לוגית אחת בהיותם תחומות תחת בגין טראן וקומית טראן.
רצונו לומר, או שכולם יצליחו או שכולם ייכשלו. זוכרים את התכונה? אטומיסיטי, יכולת האטומית.
או שאנחנו מצליחים בכל היחידה הזאת או שאנחנו נכשלים בכל היחידה. לא ניתן להצליח לחלקים.