critical section של שאילתק

shlomo500

New member
critical section של שאילתק

האם יש אפשרות להגדיר על שאילתא ב sqlServer שרק משתמש אחד יכול להפעיל את השאילתא וכל עוד שהוא לא גמר, אף אחד אחר לא יוכל להפעיל את השאילתא
 
יש מספר אפשרויות לדברים דומים

החדשות הרעות הן, שאין אפשרות להגדיר שאילתא ספציפית ולגרום לכך שהשרת תמיד יבצע את השאילתה הזאת פעם אחת מקסימום בכל רגע נתון. החדשות הטובות הן, שיש 2 דרכים לבצע דבר דומה. דרך ראשונה היא לתת locking hint בשאילתה. כאשר אני מריץ שאילתה ונותן locking hint שיגרום לנעילת exclusive על טבלה מסויימת (או כל הטבלאות), מובטח לי, שאני יהיה היחיד שיריץ את השאילתה. ניתן גם לשנות את הisolation level של הsession במקום לתת locking hint ולקבל את אותה תוצאה (רק "עותק אחד" של השאילתה ירוץ בכל פעם). צריך לקחת בחשבן, שבדרך הזאת אני עלול למנוע גם הרצה של שאילתות אחרות, שצריכות להשתמש במשאבים שננעלו. ניתן למצוא פרטים על lock hint וisolation levels בBOL. דרך אחרת היא להשתמש בapplication lock. בדרך הזאת אתה מגדיר קטע מסויים של הקוד כקטע שיכול לרוץ לבד. אח"כ אתה מבצע את השאילתות שלך ולבסוף משחרר את הנעילה. בדרך הזאת אתה לא נועל את הטבלאות, שהקוד פונה אליהן, אלה רק את קוד של האפליקציה. אפליקציות אחרות יוכלו להריץ את אותן שאילתות בדיוק (בהתאם לנעילות הרגילות של SQL Server). יש מאמר קצר ומעולה, שכתב טוני רוג'רסון (עם קטעי קוד והדגמות) שנמצא בURL http://sqlblogcasts.com/blogs/tonyrogerson/archive/2006/06/30/855.aspx . אני מאד ממליץ לקרוא את המאמר. בזמנו השתמשתי בטכניקה, שמודגמת במאמר, וזה עזר לי לפתור בעיה רצינית באחת האפליקציות.
 
למעלה