en-UShe-IL
You are here:   Blog
Register   |  Login

Blog Archive:

Maximize
* Can be used in order to search for older blogs Entries

Search in blogs


Blog Categories:

Maximize
* Can be used in order to search for blogs Entries by Categories

Blog Tags:

Maximize
* Can be used in order to search for blogs by keywords

TNWikiSummit


Awared MVP 


 


Microsoft® Community Contributor 


Microsoft® Community Contributor


 Read first, before you you use the blog! Maximize
נוב2

Written by: ronen ariely
02/11/2011 14:59 RssIcon

Minimizing Deadlocks

* הערה: המדריך עדיין בשלבי כתיבה והועלה לרשת באופן זמני כפתרון לשאלה בפורום

הקטנת מצב של נעילות של מסד הנתונים

הבעיה: הודעת שגיאה

Transaction (Process ID 68) was deadlocked on lock | communication buffer resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

ההסבר: לפני סיום זמן הרצת השאילתה מנוע המיטוב של מסד הנתונים "החליט" לנעול את הנתונים בשל פנייה אחר שקיבלה עדיפות.

הפתרון: לא ניתן למנוע לחלוטין במסד נתונים פעיל וגדול מצב של deadlock אבל בהחלט ניתן להקטין את האפשרות להגיע למצב כזה בצורה דרסטית מאוד ולגבי שאילתה ספציפית ניתן גם למנוע מצב זה לחלוטין. לצערי לא צירפת לנו DDL+DML+שאילתה שאתה מנסה להריץ ולכן אנחנו רק מדברים כרגע על תיאוריה. במדריך קצר זה אציג כמה מהפעולות שיכולות לעזור לכם להיגרר לבעיות הקשורות בנעילות.

הנה כמה דברים שיכולים לעזור:

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

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

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

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

3.       הגדרת נעילות: הגדר READ_COMMITTED_SNAPSHOT למצב ON במסד הנתונים

4.       ברמת הסקריפט/שאילתה/טרנזקציה:

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

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

4.3.    טרנזקציות צריכות להיות קצרות ותמיד בקובץ בודד.

4.4.    הגדר תמיד רמת בידוד (isolation level) מינימאלית שאתה צריך.

4.5.    השתמש ברמת בידוד ברמת רשומה כשאפשר על ידי הגדרת  READ_COMMITTED_SNAPSHOT למצב ON

/*Snapshot isolation also uses row versioning, which does not use shared locks during read operations. Before a transaction can run under snapshot isolation, the ALLOW_SNAPSHOT_ISOLATION database option must be set ON.*/
ALTER
DATABASE MyDatabase
SET
ALLOW_SNAPSHOT_ISOLATION ON
/* When the READ_COMMITTED_SNAPSHOT database option is set ON, a transaction running under read committed isolation level uses row versioning rather than shared locks during read operations. */
ALTER DATABASE MyDatabase
SET
READ_COMMITTED_SNAPSHOT ON

4.6.    השתמש בנעילות ברמת השאילתה בעזרת רמזים (Hint):

-- http://technet.microsoft.com/en-us/library/ms187373.aspx
SELECT
*
FROM MyTabele
-- Using the UPDLOCK lock hint blocks any rows attempting to update the rows
-- before the transaction completes.
WITH (UPDLOCK)
-- רמזים נוספים ברמת נעילת טבלה
-- TABLOCK
-- TABLOCKX
-- UPDLOCK
-- XLOCK
-- NOLOCK
-- NOWAIT
-- PAGLOCK
-- READCOMMITTED
-- ROWLOCK
WHERE MyField = 1

4.7.    הגדר את רמת הבידוד של הטרנזקציה בעזרת רמזים (Hint):


-- http://msdn.microsoft.com/en-us/library/aa259216(v=sql.80).aspx
SET TRANSACTION ISOLATION LEVEL
REPEATABLE READ
-- רמזים נוספים של רמות בידוד ברמת טרנזקציה
-- READ UNCOMMITTED
-- READ UNCOMMITTED
-- REPEATABLE READ
-- SERIALIZABLE
GO
BEGIN
TRANSACTION


COMMIT
TRANSACTION