none
deadlock בין select ל-delete RRS feed

  • שאלה

  • היי.

    קבלתי deadlock בין משפט SELECT ל-DELETE על אותה טבלה, כאשר אף אחד לא מוקף בטרנזקציה יזומה על ידי.

    אני מבין ש-DELETE אוטומטית נמצא בטרנזקציה, אבל גם SELECT?

    איך בדיוק נוצר DEADLOCK כזה?


    itaigitt, http://copypastenet.blogspot.com

    יום חמישי 15 נובמבר 2012 08:12

תשובות

כל התגובות

  • זה תלוי בסוג החיבור שלך לנתונים אם אתה משתמש ב READONLY  או לא.

    בעקרון ה DEADLOCK לא נרשם בלוג.

    על מנת לאפשר אותו יש להשתמש בפקודות הבאות:

    Turn it on: DBCC TRACEON(-1, 1204, 3605)
    Turn it off: DBCC TRACEOFF(-1, 1204, 3605)

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

    אני ממליץ לך לקרוא קצת על

    with (nolock)

    http://msdn.microsoft.com/en-us/library/ms187373.aspx

    ודוגמא מעשית:

    http://www.mssqltips.com/sqlservertip/2470/understanding-the-sql-server-nolock-hint/

    יום חמישי 15 נובמבר 2012 11:25
  • אבל בשביל לייצר DEADLOCK 2 הטרנזקציות צריכות לנעול. SELECT נועל?

    itaigitt, http://copypastenet.blogspot.com

    יום חמישי 15 נובמבר 2012 12:31
  • SELECT יכול ליצור נעילה.

    הנעילה הזאת לא משפיעה על SELECT אחר. אבל כן יכולה להיות מושפעת על ידי DELETE או UPDATE.

    וזה תלוי בסוג החיבור (cursor) והנעילות שאתה משתמש.

    בעקרון מומלץ להשתמש ב READONLY ואז אין את הבעיה הזאת.

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

    http://msdn.microsoft.com/en-us/library/aa259216%28SQL.80%29.aspx

    • סומן כתשובה על-ידי itaigitt יום חמישי 15 נובמבר 2012 16:01
    יום חמישי 15 נובמבר 2012 12:56
  • כן, בהחלט יכול לנעול

    כדי לבטל את הנעילה ניתן להוסיף with (nolock)

    http://www.mssqltips.com/sqlservertip/2470/understanding-the-sql-server-nolock-hint/

    • סומן כתשובה על-ידי itaigitt יום חמישי 15 נובמבר 2012 16:01
    יום חמישי 15 נובמבר 2012 14:02
  • יש כאן הרבה התייחסויות ועצות מסוכנות אז אולי כדאי לעשות קצת סדר:

    NOLOCK זה לא פתרון קסם לפתור קונפליקטים בנעילות. NOLOCK גורם למשפט לרוץ ברמת בידוד READ UNCOMMITTED שעלולות להיות לה השלכות הרסניות על נכונות תוצאות השאילתא. לפני שמשתמשים בזה יש להבין לעומק את כל המשמעויות של זה ולהיות מוכנים לקחת את הסיכון - ויש סיכון.

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

    יש גם אפשרות להשתמש ב SNAPSHOT ISOLATION על גווניו השונים שאמנם מונע DEADLOCKS מהסוג הזה אבל יש לו השלכות אחרות כמו למשל פעילות TEMPDB.

    אם תספק יותר פרטים על ה DEADLOCK הספציפי, אפשר יהיה לעזור לך (אולי) לפחות אותו.

    HTH


    Ami Levin, SQL Server MVP. CTO, DBSophic LTD. - http://www.dbsophic.com/ --Performance is the most significant driver in maintaining data and service availability.--

    יום חמישי 15 נובמבר 2012 21:25