ورود

View Full Version : SQl Server & Stored Procedure & Concurrency



mzjahromi
دوشنبه 07 فروردین 1385, 11:21 صبح
فرض کنیم ما دو تا Stored Procedure داریم
دو تا کاربر این دو تا رو همزمان صدا زده اند.
فرض کنید هر کدوم یه فیلد خاص مثلا بزرکترین مقدا فیلد X رو میخونن و اونو یکی اضافه می کنن و یک رکورد با این مقدار از فیلد X درج می کنن.
فیلد X هم کلید اصلی است
بنا بر این اگر هر کدام از SPها Max(X) رو بخونن هردو یک مقدار رو دارنو موقع درج رکورد تکراری بوجود میاد(البته این مورد رو خود SQLServer کنترل میکنه)
حالا می خواستم بدونم SQL Server این همروندی رو کنترل میکنه.
یا واضح تر بگم اگر درخواست اجرای دو SP توسط دو کاربر متفاوت داشته باشیم ایا این دو SP به صورت همروند اجرا میشن یا اول یکی اجرا میشه بعد اونیکی؟
اگر همروند اجرا میشن چه راه حلی برای Serialize کردن اینا پیشنهاد میکنید؟
یه جواب قابل اعتماد می خواهم

AminSobati
سه شنبه 08 فروردین 1385, 01:32 صبح
دوست عزیزم،
از اولین روز پیدایش بانک های اطلاعاتی، مسئله همزمانی کاربرها مطرح بوده ولی هر نرم افزاری، به گونه مخصوص به خودش این نیازها رو پاسخ گفته. مثلا زمانیکه یک فیلد باید Auto Number باشه، دقیقا مسئله ای که تشریح کردید ممکنه اتفاق بیافته. لذا فیلد Identity در SQL Server این تضمین رو به شما میده که دو کاربر همزمان، مقادیر یکسان ایجاد نکنند. اما حالتهایی پیش میاد که شما از Identity نمیتونین استفاده کنین ولی به نوعی موضوع Max گرفتن وجود داره. یکی از روشهای متداول در چنین مواردی این هست که شما جدول رو Lock کنید، Max بگیرید، Insert رو انجام بدین و جدول رو از Lock خارج کنید. اشکال روش مذکور اینجاست که در این طول مدت، کاربرهای دیگه حتی Query هم نمیتونن از جدول بگیرند. لذا جدول دیگری در نظر میگیریم، مقدار Max رو در اون ذخیره میکنیم. SP که کار Insert رو انجام میده، ابتدا Max رو از جدول جدید میخونه (ضمن اینکه Lock کرده)، افزایش مقدار انجام میده و Insert میکنه. لذا در طول این مدت، جدول اصلی برای عمل خواندن Lock نشده و جدولی که Max رو نگه داری میکنه Lock میشه. برای اینکه Query شما از یک جدول باعث Lock کردن اون بشه، میتونین از SET TRAN ISOLATION LEVEL REPEATABLE READ به همراه بعضی Query Hintها استفاده کنید. برای بدست آوردن اطلاعات بیشتر، مبحث ISOLATION LEVEL در Books Online رو مطالعه بفرمایید.

mzjahromi
سه شنبه 08 فروردین 1385, 07:56 صبح
ممنون از لطفتون
من این مشکل رو توی برنامه نویسی سه لایه با استفاده از سمافور حل کردم ولی توی برنامه نویسی معمولی نمیتونستم این کار رو انجام بدم. فکر کردمم شاید خود DBMS راهی برای حل این مشکل داشته باشه.