מה כלול בטרנזקציה?

יום רביעי, יולי 18, 2012

נתחיל מתעלול בלתי שימושי בעליל- ציוץ מתוך ה-SSMS (אינני מתכוון לטוויטר אלא להשמעת קול דרך הרמקול): (הרצתי את זה בהצלחה במחשב בו מותקן מקומית SQL Server R2 עם מערכת הפעלה XP וכשניסיתי להריץ מול שרת מרוחק- החלון נתקע והייתי צריך לסגור אותו) Exec master..XP_CmdShell 'C:\WINDOWS\ServicePackFiles\i386\sndrec32 /play /close "C:\Windows\Media\Notify.wav"'; מי שזה לא עובד לו- או שהרמקול מכובה, או ששני הקבצים נמצאים במקום אחר בשל הבדלים בגרסאות מערכת ההפעלה, או שזה נתקע לו כי לא מדובר בהתקנה מקומית של השרת אלא בעמדה מרוחקת, או שהוא לא קינפג את XP_CmdShell לשימוש וכו'.. ...
אין תגובות

מערכת למעקב אחר ריצת פרוצדורות

יום ראשון, מאי 1, 2011

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

טרנזקציות מקוננות

יום שבת, מרץ 5, 2011

כל מי שעובד עם טרנזקציות מפורשות - אמור לדעת שבטרנזקציות אין קינון אמיתי. כלומר- אם בתוך טרנזקציה נפתח טרנזקציה חדשה, כל עוד לא התבצע ה-Commit האחרון - שום דבר לא נשמר באמת, ואם נבצע Rollback - הוא "יפיל" את כל הטרנזקציות. למשל- קורה שמפעילים פרוצדורה שבתוכה נפתחת טרנזקציה, במהלך הריצה היא מפעילה פרוצדורת משנה שגם פותחת טרנזקציה וכך הלאה; אך מכל בחינה מעשית יש רק טרנזקציה אחת פתוחה כל הזמן, למרות שלכאורה יש קינון של זו בתוך זו. דוגמה - ניצור פרוצדורה שמבצעת פעולה כלשהי, פותחת טרנזקציה, מבצעת עוד פעולה, פותחת עוד טרנזקציה, מבצעת עוד פעולה ומסיימת...
אין תגובות

טרנזקציה אחת רחוק מדי

יום שני, ינואר 17, 2011

כתבתי פרוצדורה הכוללת שימוש בטרנזקציות, ולסיום - רק כדי כדי להיות בטוח שלא השארתי אף טרנזקציה פתוחה בטעות - כתבתי את הקוד הבא: While @@TranCount>0 Commit Tran; כשהרצתי קיבלתי הודעת שגיאה חוזרת ונשנית, ולקח לי זמן להבין את הסיבה לכך: את הפרוצדורה שכתבתי הפעלתי באמצעות פרוצדורה אחרת שכללה פתיחה של טרנזקציה, וכתוצאה מהקוד הנ"ל- כל הטרנזקציות נסגרו, כולל זו של הפרוצדורה המפעילה, וזה יצר את השגיאה. רציתי להיות בטוח שהכל בסדר ויריתי לעצמי כדור ברגל.. מסקנה: יותר טוב להיות עשיר וחכם מאשר עני וטיפש.:-(
אין תגובות

טרנזקציות ופעולות DDL

יום חמישי, דצמבר 23, 2010

טרנזקציות מקושרות בתודעתנו לפעולות DML (שינויים בנתוני הטבלאות): אם בתוך הטרנזקציה הוספנו, שינינו, מחקנו וכו', ולבסוף ביצענו Rollback - כל השינויים מתבטלים ואנחנו חוזרים לנקודת ההתחלה. ב-SQL Sever הטרנזקציות משפיעות גם על פעולות DDL (שינויים במבני טבלאות): יצירת אובייקטים, ביטול אובייקטים ושינוי אובייקטים. כך למשל פעולת -Truncate Table שהיא בעצם יצירה מחדש של הטבלה - המתבצעת בתוך טרנזקציה, תתבטל במקרה של Rollback. הייתה לי היום תזכורת מעט משעשעת (בדיעבד) לכך- אני כותב פרוצדורה מורכבת הכוללת שימוש בטבלאות זמניות בעזרת SQL דינאמי, ומכיוון שטבלאות זמניות פרטיות (בעלות #סולמית בודדת) נמחקות בסיום הפרוצדורה - במהלך הפיתוח אני משתמש בפרוצדורות...

טרנזקציות – מה לא ידעתי עד כה?

יום רביעי, אוקטובר 6, 2010

אתמול במפגש ISUG, גיא גלנצר ממדירה הירצה בין היתר על טרנזקציות, תחום שלתומי חשבתי שהכל בו פשוט ומוכר, והתברר שאין זה כך.. למשל הקוד הבא- פותחים טרנזקציה ראשית, מעדכנים טבלה, פותחים טרנזקציה משנית, מעדכנים טבלה, מבצעים Commit לטרנזקציה המשנית, ו-RollBack לראשית: Use tempdb; Go IF Object_Id('T_Trn','U') Is Not Null Drop Table T_Trn; Go Create Table T_Trn(I Int); Go Begin Tran Tr1; Go Insert Into T_Trn Values(1); Go Begin Tran Tr2; Go Insert Into T_Trn Values(2); Go Commit Tran Tr2; Go Rollback; Go Select * From T_Trn; Go האם ה-Commit הראשון שומר "באופן בלתי הפיך" את הערך 2 או שמא זה לא נגמר עד שהגברת מתחילה לשיר ומתבצע ה-Commit הסופי על הכל? 1. אם בסוף מתבצע Rollback- מתבטל כל מה שנעשה במהלך הטרנזקציה...

טרנזקציות, שגיאות ושגרות שגיאה: השימוש באופציית Xact_Abort ובפונקציה Xact_State

יום שני, אוגוסט 23, 2010

האופציה Xact_Abort מגדירה אם בשעת שגיאה לעצור את הריצה ולבצע Rollback לטרנזקציה (On) או לא (Off), כאשר האופציה השניה היא ברירת המחדל. הפונקציה Xact_State קובעת האם יש טרנזקציה פתוחה (1) או אין טרנזקציה פתוחה (0); וכן האם יש טרנזקציה פתוחה שלא ניתן לבצע לה Commit אלא רק Rollback בשל שגיאה (1-). דוגמה 1 – ניצור טבלה עם Primary Key (אסור להכניס ערכים כפולים), ונראה מה קורה במקרה של Xact_Abort Off (ברירת החמדל): Use tempdb; Go If Object_Id('T','U') Is Not Null Drop Table T; Go Create Table T(A Int Not Null Primary Key); Go Set Xact_Abort Off;--ברירת מחדל Select 1 N, 'Before...