ההבדל בין T-SQL לבין שאילתת SQL רגילה

יאירN

New member
ההבדל בין T-SQL לבין שאילתת SQL רגילה

שלום לכם אנשים, מישהו יכול להסביר לי בבקשה מהו ההבדל בין טרנזקציית SQL לבין שיאלתות רגילות? פשוט לאחרונה התחלתי לעבוד עם זה בחברה ולא הבנתי מה רוצים ממני. תודה מראש, יאיר
 

s h i m s h o n

New member
לא להתבלבל

בילבלת בין המותג T-SQL למושג "טרנזקציה". T-SQL היא הרחבה לשפת SQL, שמשמשת DB-ים ספציפיים (SQL-Server ו- Sybase). טרנזקצית SQL היא מושג כללי בעולם בסיסי-הנתונים. בגדול, טרנזקציה היא אוסף של פעולות עדכון/הוספה/מחיקה, שעובדות בשיטת "הכל או כלום", כלומר כולן מבוצעות או מבוטלות יחד. אחד מהדברים ש-DB חייב להבטיח, הוא שלא קורה מצב שבו מבוצע רק חלק מטרנזקציה. בד"כ, טרנזקציה מאושרת ע"י הוראת COMMIT, ומבוטלת ע"י הוראת ROLLBACK (למד על הוראות אלה). בברכה, ש.
 

יאירN

New member
לעומת שאילתא רגילה שאין לה את זה?

ואיפה נישמר לוג הפעולות של הטרנזקצייה במידה והיא לא הסתיימה? ואם לא הגעתי ל COMMIT אז הלוג נישמר וההפך? כלומר מהם התנאים לשמירת לוג? מתי הלוג נמחק? אם הוא הגיע לCOMMIT?
 

s h i m s h o n

New member
אלה הן שאלות תלויות-מסד

אך באופן כללי, ב-99% מהמקרים טרנזקציה תעצר כי הופסקה באופן מכוון (Rollback יזום). במקרים כאלה, האפליקציה "יודעת" מדוע נפסקה הטרנזקציה. לגבי הפסקת טרנזקציה בגלל תקלה, ה-DB אמור לטפל בזה בעצמו, אם אוטומטית בעליה הבאה, או באופן יזום ע"י ה-DBA. בכל מקרה ה-Recovery (של טרנזקציה מופרעת) אמור להיות שקוף וללא תקלות. כדאי בכל-זאת להבין את המכניזם והקבצים המשתתפים בתהליך שכזה - זה ענין שונה מ-DB אחד לרעהו. במקרה של COMMIT (טרנזקציה נסתיימה/אושרה בהצלחה), המידע שמור בטבלאות (קבצים) הסופיות! כלומר, במקרה זה אין צורך עוד בלוג, אלא אם רוצים לשמור תעוד היסטורי של פעילות במערכת (Auditing). שלמותו של מידע כזה, ששמור כבר בטבלה (Committed), אינה תלויה בהצלחתן/כשלונן של טרנזקציות שרצות, וגיבוי שלו וביצוע Recovery שלו, הינם נושא נפרד לגמרי. בברכה, ש.
 

גרי רשף

New member
ההבדל

סקריפט זו סדרת פקודות SQL בקובץ טקסט או באתר אינטרנט או במאמר בכתב עת מקצועי. נניח- סקריפט לגיבוי דטבייס, או ליצירת טבלה, או למתן הרשאות למשתמש. טרנזציה זו סדרת פקודות המתבצעות על תנאי מול השרת, כשבסוף תוכל להחליט אם לאשר את ביצוען או לבטל. למשל- אתה רוצה להעביר רשומות מהטבלה השוטפת לטבלה ההיסטורית, וחושש שלאחר שתיצור אותן בהיסטורית לא תצליח למחוק מהשוטפת בגלל בעיית הרשאות או קישרי גומלין, ולכן את מבצע זאת כטרנזקציה ואז או שהכל מתבצע או ששום דבר אינו מתבצע. כמובן שאפשר לקחת סקריפט ולהריץ אותו כטרנזקציה.
 
אם הבנתי אותך נכון (מה שאינני בטוח)

"סקריפט" תמיד יתבצע, טרנזקציה תתבצע בתנאי שהוספתי commit ? גם אם הבנתי לא ברור לי מה ההבדל, הרי ברגע שהחלטתי על commit זו אותה החלטה כמו להריץ סקריפט. אז כנראה שלא הבנתי...
 
לא הצלחת להבין

טראנסאקציה זה אוסף של פעולות פיסיות על הנתונים, שניתן להתייחס אליהם כפעולה לוגית אחת. במידה שפעולה פיסית אחת נכשלה, ניתן לבטל את כל שאר הפעולות. ניקח את הדוגמא הקלאסית, שכמעט תמיד מופיעה בספרות. נניח, שאני כותב אפליקציה בנקאית. באפליקציה יש מודול שמבצע העברה של כסף בין חשבונות. כאשר אתה משתמש באפליקציה ומעביר כסף לחשבון שלי, מבחינתך מתבצעת פעולה אחת. באפליקציה לעומת זאת מתבצעות מספר פעולות. לצורך הדוגמא נניח, שמתבצעות שלושת הפעולות האלו: הורדת 1000 ש"ח מהחשבון של ואלרי הוספת 1000 ש"ח לחשבון של חובב טניס כתיבת רשומת לוג ליומן הפעולות. ברור שאסור שיקרה מצב שחלק מהפעולות מתבצעות וחלק לא. אסור שמהחשבון של ואלרי ירדו 1000 ש"ח, אבל לחשבון של חובב טניס לא ייתווספו 1000 ש"ח. ע"מ להגן על מצב כזה ניתן להגדיר את שלושת הפעולות האלו כטראנסאקציה אחת. במקרה, שזה מוגדר כטראנסאקציה, ניתן לבטל את כל השינויים שבוצעו. הקוד יראה כך: התחלת טראנסאקציה הורדת 1000 ש"ח מהחשבון של ואלרי הוספת 1000 ש"ח לחשבון של חובב טניס כתיבת רשומת לוג ליומן הפעולות. במידה ואחת הפעולות לא הצליחה להתבצע בטל את כל הפעולות (rollback) במידה וכל הפעולות הצליחו תבצע את כל השינויים (commit).
 
למעלה