fbpx

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

Identify Locks

בדוגמא זו, יוזר HR הריץ פעולת DML על עובד מספר 100, ארבע שניות מאוחר יותר יוזר TEST ניסה לבצע את אותה פעולה, כמו שניתן לראות – יוזר TEST ננעל.

כעת, באמצעות הגישה לטבלת v$session נוכל לראות את אותם יוזרים. ניתן להשתמש בשאילתה הבאה לדוגמא :


SELECT     sid, serial#, username, program,
        CASE WHEN blocking_session IS NOT NULL THEN 'Blocked by session ' || blocking_session
        ELSE 'Blocker'
 END AS "DESCRIPTION"
 FROM v$session
 WHERE sid IN (SELECT blocking_session FROM v$session)
 OR
 BLOCKING_SESSION IS NOT NULL ;

 

כעת ניתן לראות את הסשנים הנועלים והנעולים.


SID            SERIAL#     USERNAME        PROGRAM                     DESCRIPTION
---------- ----------     --------------- --------------- ------------------------
34            312     TEST                sqlplus.exe         Blocked by session 47
47             67         HR                  sqlplus.exe         Blocker

Resolving Locks

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

Kill Session

טכניקה ראשונה המאפשרת לנו להתמודד עם נעילות במערכת היא פקודת ה Kill Session


ALTER SYSTEM KILL SESSION 'SID,SERIAL#' ;
ALTER SYSTEM KILL SESSION '47,67' ;

פקודת ה Kill Session למעשה לא באמת "הורגת" את ה Session אלא מבקשת ממנו, בצורה יפה כמובן – להתאבד 🙂 משמעות הדבר היא שכאשר ל Session יש פעולות רבות אשר אמורות להסתיים לפני שהוא יכול להסגר (כגון פעולות Rollback כבדות) הסשן הנותן את פקודת ה Kill עלול להמתין זמן רב (ולהיות "תקוע") עד אשר יקבל את האישור הסופי שפקודת ה Kill עברה בהצלחה.

Kill Session Immediate

הטכניקה השניה, מאוד דומה לראשונה – נקראת Kill Session Immediate. פקודה זו עושה את אותה פעולה אשר פעולת ה Kill Session עושה אבל מחזירה את השליטה לידיים של הסשן אשר מריץ את פקודת ה Kill באופן מיידי.


ALTER SYSTEM KILL SESSION 'SID,SERIAL#' IMMEDIATE ;
ALTER SYSTEM KILL SESSION '47,67' ;

Disconnect Session

הטכניקה השלישית עושה משהו אחר לחלוטין – בעוד שפקודות ה Kill "מבקשות" מהסשן הבעייתי להסגר, פקודת ה Disconnect שקולה לסגירת ה Server Process באמצעות פקודות מערכת ההפעלה.
כאשר אנו משתמשים בפקודות ה
Disconnect יש באפשרותנו לבחור בין שתי אופציות :


ALTER SYSTEM DISCONNECT SESSION 'SID,SERIAL#' POST_TRANSACTION ;

כשם ששמה מרמז – POST_TRANSACTION תסגור את הסשן הנוכחי רק לאחר שכל הטרנסאקציות יסתיימו בהצלחה.


ALTER SYSTEM DISCONNECT SESSION 'SID,SERIAL#' IMMEDIATE ;

לעומה פקודת ה IMMEDIATE אשר מסיימת את פעולתו של הסשן הנוכחי באופן מיידי.

 נכתב ע"י רם קדם