none
SET LOCK_TIMEOUT is ignored RRS feed

  • שאלה

  • Hi,

    I have a stored procedure aimed to verify a main table is not locked. Here is the code:

    BEGIN TRY
    SET LOCK_TIMEOUT 1000
    BEGIN TRAN
    INSERT INTO Session(SessionID,SrvID,MachineName,LoginName,DomainName)
    SELECT NEWID(),NEWID(),'ObserveITTest','ObserveITTest','ObserveITTest'
    ROLLBACK
    SELECT @IsLocket = 0  
    END TRY
    BEGIN CATCH
    ROLLBACK
    SELECT @IsLocket = 1
    END CATCH

    First resource wait is lock.

    In profiler I see many calls for this SP with duration of exactly 15 seconds (14.99-15.01).

    How can it be?
    The duration should not be more then 1 second.

    יום שני 16 דצמבר 2019 17:06

תשובות

  • Hi,

    I have a stored procedure aimed to verify a main table is not locked. Here is the code:

    BEGIN TRY
    SET LOCK_TIMEOUT 1000
    BEGIN TRAN
    INSERT INTO Session(SessionID,SrvID,MachineName,LoginName,DomainName)
    SELECT NEWID(),NEWID(),'ObserveITTest','ObserveITTest','ObserveITTest'
    ROLLBACK
    SELECT @IsLocket = 0  
    END TRY
    BEGIN CATCH
    ROLLBACK
    SELECT @IsLocket = 1
    END CATCH

    First resource wait is lock.

    In profiler I see many calls for this SP with duration of exactly 15 seconds (14.99-15.01).

    How can it be?
    The duration should not be more then 1 second.

    שלום יובל וברוך השב לפורומים של MSDN 😀

    בירוקרטיה מעט:

    1. אני מבין שפרסמת את השאלה גם בפורום בשפה האנגלית וגם כאן בפורום בשפה העברית. כאמור הפורום הזה נועד לשפה העברית וכדאי להקפיד על שימוש בשפה העברית כאן/

    2. זה לא פעם ראשונה שאתה מגיע לפורום. בעבר שכחת לבדוק את התגובות שקיבלת. אני מבין שזה יכול לקרות לכל אחד כמובן אבל נסה להקפיד על כך בבקשה.

    https://social.msdn.microsoft.com/Forums/he-IL/acb9d848-ff5d-4b40-8b32-4fdd6b0e2bed/

    -------אני לא בטוח שהבנתי את השאלה אבל נחזור לשאלה בקצרה----------

    אני אנסה לסכם אם הבנתי נכון:

    אתה אומר שיש לך פרוצדורה אשר מנטרת את הזמן נעילה של טבלה.

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

    אם הבעיה היא שיש קשורה לנעילות מה שאתה צריך זה לאתר את הסיבה לנעילה הבעייתית מבחינתך.

    הקישור הבא יכול לעזור:
    https://www.mssqltips.com/sqlservertip/2732/different-techniques-to-identify-blocking-in-sql-server/

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

    אם הבעיה קשורה לכך ש LOCK_TIMEOUT לא משפיע אז (1) תזכור שלא כל הפעולות מכבדות הגדרה זו (למשל פעולות ברמת מסד הנתונים). (2) תבדוק אפשרות להמציד את ההגדרה לפעולה למשל תכניס את ההגדרה לטרנזקציה עם הפעולה ותוודא שאין איפוס של הערך של זמן ההמתנה המקסימלי בזמן הפעולה באמצעות בדיקה שלך הערך @@LOCK_TIMEOUT

    בשני המקרים בזמן שיש לך נעילה אנא בדוק מה נועל את מה (האם זו אכן הפעולה שננעלת ל 15 שניות ה INSERT ובאיזה הקשר השאילתה נמצאת) וספק מידע נוסף ככל האפשר.


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]    [Linkedin]



    יום שני 16 דצמבר 2019 18:46
    מנחה דיון

כל התגובות

  • Hi,

    I have a stored procedure aimed to verify a main table is not locked. Here is the code:

    BEGIN TRY
    SET LOCK_TIMEOUT 1000
    BEGIN TRAN
    INSERT INTO Session(SessionID,SrvID,MachineName,LoginName,DomainName)
    SELECT NEWID(),NEWID(),'ObserveITTest','ObserveITTest','ObserveITTest'
    ROLLBACK
    SELECT @IsLocket = 0  
    END TRY
    BEGIN CATCH
    ROLLBACK
    SELECT @IsLocket = 1
    END CATCH

    First resource wait is lock.

    In profiler I see many calls for this SP with duration of exactly 15 seconds (14.99-15.01).

    How can it be?
    The duration should not be more then 1 second.

    שלום יובל וברוך השב לפורומים של MSDN 😀

    בירוקרטיה מעט:

    1. אני מבין שפרסמת את השאלה גם בפורום בשפה האנגלית וגם כאן בפורום בשפה העברית. כאמור הפורום הזה נועד לשפה העברית וכדאי להקפיד על שימוש בשפה העברית כאן/

    2. זה לא פעם ראשונה שאתה מגיע לפורום. בעבר שכחת לבדוק את התגובות שקיבלת. אני מבין שזה יכול לקרות לכל אחד כמובן אבל נסה להקפיד על כך בבקשה.

    https://social.msdn.microsoft.com/Forums/he-IL/acb9d848-ff5d-4b40-8b32-4fdd6b0e2bed/

    -------אני לא בטוח שהבנתי את השאלה אבל נחזור לשאלה בקצרה----------

    אני אנסה לסכם אם הבנתי נכון:

    אתה אומר שיש לך פרוצדורה אשר מנטרת את הזמן נעילה של טבלה.

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

    אם הבעיה היא שיש קשורה לנעילות מה שאתה צריך זה לאתר את הסיבה לנעילה הבעייתית מבחינתך.

    הקישור הבא יכול לעזור:
    https://www.mssqltips.com/sqlservertip/2732/different-techniques-to-identify-blocking-in-sql-server/

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

    אם הבעיה קשורה לכך ש LOCK_TIMEOUT לא משפיע אז (1) תזכור שלא כל הפעולות מכבדות הגדרה זו (למשל פעולות ברמת מסד הנתונים). (2) תבדוק אפשרות להמציד את ההגדרה לפעולה למשל תכניס את ההגדרה לטרנזקציה עם הפעולה ותוודא שאין איפוס של הערך של זמן ההמתנה המקסימלי בזמן הפעולה באמצעות בדיקה שלך הערך @@LOCK_TIMEOUT

    בשני המקרים בזמן שיש לך נעילה אנא בדוק מה נועל את מה (האם זו אכן הפעולה שננעלת ל 15 שניות ה INSERT ובאיזה הקשר השאילתה נמצאת) וספק מידע נוסף ככל האפשר.


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]    [Linkedin]



    יום שני 16 דצמבר 2019 18:46
    מנחה דיון
  • דרך אגב,

    אם אתה רוצה לנעול טבלה בזמן הנכסת נתונים בצורה יזומה אז אני ממליץ לקרוא יותר חומר על: שימוש ברמז HOLDLOCK או שימוש ברמז ברמז TABLOCKX ברמת השאילתה

    נקודה נוספת: שים לב שפעולת INSERT תמיד מתבצעת בתוך טרנזקציה גם אם אתה לא  מגדיר טרנזקציה במפורש


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]    [Linkedin]

    יום שני 16 דצמבר 2019 20:08
    מנחה דיון
  • תודה רונן,

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

    בפועל, הפרוצדורה חוזרת אחרי 15 שניות.

    אני בהחלט לא מעויניין לנעול את הטבלה.

    יום שלישי 17 דצמבר 2019 10:24
  • תודה רונן,

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

    בפועל, הפרוצדורה חוזרת אחרי 15 שניות.

    אני בהחלט לא מעויניין לנעול את הטבלה.

    אהלן יובל

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

    אבל מעל לכך תזכור שזמן הפעולה הכללית לא נקבע רק על ידי נעילות. יש לך את זמני העבודה של ה CPU למשל ושל פרסור השאילתה והתוצאות וזמני ההעברה ועוד הרבה מאוד פרמטרים

    הנושא של מיטוב שאילתות והנושא של ניטור זמני הרצאה הם שני נושאים קרובים ושניהם נושאים מתקדמים. אם זה שמעניין הרבה אנשים אז אני יכול להעביר הרצאה בנושא בקבוצה של PASS למשל.

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

    >> המטרה היא לקבל אינדיקציה אם הטבלה נעולה. 

    כאמור תבדוק את הקישור ששמתי מעל לגבי כיצד לנטר כל מה שקשור לנעילות.

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


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]    [Linkedin]

    יום שלישי 17 דצמבר 2019 10:59
    מנחה דיון