DCSIMG
השימוש ב-Context_Info למעקב אחר תהליכים - גרי רשף

השימוש ב-Context_Info למעקב אחר תהליכים

לפני מספר שבועות כתבתי פוסט על השימוש ב-Context_Info: משתנה ברמת ה-Session המאפשר לשמור מחרוזת באורך של עד 128 תווים שקיימת כל עוד ה-Session פתוח.
כתבתי כי נתקלתי במקרה באופציה הזו, ניסיתי אותה, והרהרתי כיצד ניתן להשתמש בה (ביננו- למה יש טבלאות?..).
רצה הגורל והתבקשתי לטפל בבעייה ומצאתי פתרון שהשימוש ב-Context_Info תפור בדיוק על פי מידותיו.
אנחנו מריצים תהליכים מורכבים של העברה ועיבוד נתונים: פרוצדורה ראשית שמפעילה מספר פרוצדורות שכל אחת מפעילה פרוצדורות משנה וכו'.
אסור להריץ את התהליך במקביל לעצמו, ולכן כשהוא רץ יש למנוע אפשרות להריץ אותו פעם נוספת, וכשהוא מסתיים – בהצלחה או בכשלון – כן יש לאפשר.
לוגיקה זו ממומשת באמצעות טבלה בה מעודכן תא הסטטוס ל"ריצה" כשהריצה מתחילה, ול"הצלחה" או "כשלון" כשהריצה מסתיימת; וממשק המשתמש דרכו מפעילים את התהליך- בודק את הסטטוס בטבלה ולפי זה קובע אם לאפשר (“הצלחה” או “כשלון”) או לא (“ריצה”).
הבעייה היא שכשהתהליך נופל- לא תמיד הסטטוס מתעדכן: נכון שלכל הפרוצדורות יש Try & Catch שאמור להפנות אותן לפרוצדורת עזר שמעדכנת אותו, אלא שנפילה של תהליך מטבעה היא בלתי צפויה מראש ויתכנו מצבים בהם הסטטוס אינו מתעדכן ואז צריך להתערב ידנית ולעדכן אותו מכיוון שמבחינת ממשק המשתמש התהליך עדיין רץ למרות שהוא לא.
זה לא נגמר בזה- ההתערבות הידנית עצמה לפעמים יוצרת בעייה במקום לפתור אותה, וכבר קרה שחשבו שהתהליך נפל למרות שהוא בסך הכל עבד לאט מהצפוי, הסטטוס שונה, והתחילה ריצה חדשה במקביל לקיימת..
ב-ק-י-צ-ו-ר: כיצד נדע בוודאות אם התהליך רץ כעת או לא (בהתחשב בכך שהסטטוס אינו אמין)?
פתרון: בתחילת כל ריצה נעדכן את Context_Info ל-"תהליך ... רץ", וממשק המשתמש יצטרך רק לבדוק ב-sys.sysprocesses אם יש Session שזה הערך של ה- Context_Infoשלו: אם יש אזי התהליך רץ (גם אם הוא תקוע..), ואם לא – אזי אינו רץ ואחת היא לנו אם זה בגלל שהוא הצליח או נפל.
כל עוד התהליך רץ- הכל מתבצע באותו Session (כל עוד אין שימוש ב-Service Broker או בכלי אסינכרוני אחר), וכשהוא מסתיים- ה- Context_Info נמחק ולא יראה עוד גם אם במקרה נפתח Session חדש באותו מספר.
לסיכום, כפי שאמר קוהלת: לַכֹּל, זְמָן; וְעֵת לְכָל-חֵפֶץ, תַּחַת הַשָּׁמָיִם (קהלת ג 1), גם ל-Context_Info.

תוכן התגובה

# ???????????? ??-Context_Info ?????????? ?????? ?????????????? « ?????????? ???? ?????? ??????

Pingback from  ???????????? ??-Context_Info ?????????? ?????? ?????????????? « ?????????? ???? ?????? ??????

שלח תגובה

(שדה חובה) 
(שדה חובה) 
(אופציונלי)
(שדה חובה) 

Enter the numbers above: