PDA

View Full Version : Use optimistic concurrency در sqldatasource



peymannaji
پنج شنبه 29 شهریور 1386, 18:54 عصر
سلام
وقتی یک sqldatasource ایجاد میکنیم بعد از اجرای configure data source یک دکمه advance داره ( Advanced sql Generation ) وقتی وارد این قسمت میشیم گزینه اول که مربوط به اینه که کدهای update , delete ... را اتوماتیک ایجاد کنه اما یک قسمت دیگه هم هست به نام Use optimistic concurrency میخواستم بودونم این قسمت دقیقا" وظیفه اش چی هست و چه کاری انجام میده ؟؟؟؟
با تشکر ...

Behrouz_Rad
پنج شنبه 29 شهریور 1386, 21:48 عصر
البته این مبحث مربوط به پایگاه داده میشه، اما خوب شما زرنگی کردی و به نوعی به این بخش ربطش دادی ;)

Data Concurrency یا همان "همزمانی داده ها" یکی از مباحث پایگاه داده است که به صورت ساده و خلاصه در مورد حذف یا آپدیت همزمان داده هایی در "یک زمان" توسط دو کاربر مختلف و ارائه ی راه حل هایی برای حل این مسئله بحث می کنه.
دو نوع داره: Optimistic Concurrency (همزمانی خوشبینانه) و Pessimistic Concurrency (همزمانی بدبینانه)

در "همزمانی بدبینانه" چون تمامی رکوردهای خوانده شده از دیتابیس تا زمان پایان کار با اونها Lock میشن، نیاز به یک Connection پایدار با دیتابیس هست که به همین دلیل این روش در وب بی معنا میشه و حتی در برنامه های Desktop نیز تنها برای مواقعی پیشنهاد میشه که طول زمان در اختیار داشتن رکوردها توسط کاربر کم هست.

در "همزمانی خوشبینانه" رکوردها Lock نمیشن. در عوض مقادیر اصلی رکورد(ها)یی که کاربر اونها رو بازیابی کرده در جایی نگهداری میشن و در پایان کار (آپدیت یا حذف) با مقادیر اولیه(اصلی) رکورد (هایی) که کاربر اونها رو تغییر داده و یا حذف کرده مقایسه میشن. اگر این مقادیر با مقادیر موجود در دیتابیس برابر نبودند، مشخص میشه که کاربر دیگه ای در همان زمان در رکورد تغییر ایجاد کرده.

SqlDataSource از طریق خاصیت ConflictDetection، "همزمانی خوشبینانه" رو مدیریت می کنه.
مقدار پیش فرض این خاصیت، OverwriteChanges هست که بدون توجه به اینکه رکوردی تغییر کرده یا نه، رکورد رو آپدیت یا حذف می کنه. این حالت به "last writer wins" معروف هست.
مقدار دیگه ی این خاصیت، CompareAllValues هست که حالت ذاتی "همزمانی خوشبینانه" رو که در پاراگراف فوق توضیح دادم پیاده سازی میکنه.
برنامه نویس در کدهای برنامه باید حالت بعد از وقوع حالات فوق رو مدیریت کنه.

تکمیلی:
برنامه نویسان حرفه ای از این روش ها استفاده نمی کنند.
روش های مرسوم و متداول دیگه ای که برای کنترل همزمانی استفاده میشه در حالت استاندارد و مستقل از Desktop یا Web، ایجاد یک فیلد از نوع timestamp برای کنترل زمان آخرین تغییرات هست.
در SQL Server 2005 و در برنامه های ویندوزی نیز از Query Notification استفاده میشه.

موفق باشید.

peymannaji
پنج شنبه 29 شهریور 1386, 22:48 عصر
سلام بهروز عزیز .
واقعا" توضیحاتت عالی بود خیلی مفید ... چیزی که من از نوشته های شما درک کردم این بود که استفاده از آیتمOptimistic Concurrency باعث میشه عملیاتی که توسط کاربران ( همزمان و غیره همزمان ) بروی دیتا بیس انجام میشه ابتدا در یک جای خاص نگهداری بشه و در یک زمان مناسب بروی دیتا بیس اصلی تغییرات اعمال بشه ... آیا درکی که داشتم درسته ؟
سوال بعدیم اینه که شما گفتید این روشها رو برنامه نویسان حرفه ای انجام نمیدن و روشهای بهتری هست . حالا که ما روشهای افراد حرفه ای رو نمیدونیم آیا می توانیم تا آن زمان از همین Optimistic Concurrency استفاده کنیم ؟ به عبارت دیگه آیا این روش میتونه مفید باشه ؟

با تشکر فراوان ...

mahdi_negahi
پنج شنبه 29 شهریور 1386, 22:49 عصر
فیلد از نوع timestamp برای کنترل زمان آخرین تغییرات هست.


استاد راد در این باره و روش استفادش میشه یک توضیح بدهید

Behrouz_Rad
پنج شنبه 29 شهریور 1386, 23:46 عصر
چیزی که من از نوشته های شما درک کردم این بود که استفاده از آیتمOptimistic Concurrency باعث میشه عملیاتی که توسط کاربران ( همزمان و غیره همزمان ) بروی دیتا بیس انجام میشه ابتدا در یک جای خاص نگهداری بشه و در یک زمان مناسب بروی دیتا بیس اصلی تغییرات اعمال بشه ... آیا درکی که داشتم درسته ؟

"عملیات" نه! "مقادیر"
اگر از CompareAllValues استفاده کنی، مقادیر اصلی به صورت جداگانه بازیابی میشن و پارامترهای متفاوتی برای اونها ساخته میشه.
نام این پارامترهای جداگانه هم از قانون خاصی برای نامگذاری پیروی می کنه و از خاصیت OldValuesParameterFormatString خونده میشه. به طور پیش فرض نام پارامتر به شکل "originalValue_fieldName" هست.


سوال بعدیم اینه که شما گفتید این روشها رو برنامه نویسان حرفه ای انجام نمیدن و روشهای بهتری هست . حالا که ما روشهای افراد حرفه ای رو نمیدونیم آیا می توانیم تا آن زمان از همین Optimistic Concurrency استفاده کنیم ؟ به عبارت دیگه آیا این روش میتونه مفید باشه ؟

البته کار راه بنداز که هست اما هیچ وقت سعی نکن به روش های موجود قناعت کنی.
همیشه در پی کشف روش های جدیدتر یا حتی اختراع اونها باش!


استاد راد در این باره و روش استفادش میشه یک توضیح بدهید

یک فیلد از نوع timestamp در جدول مورد نظر قرار میگیره و همزمان با آپدیت داده ها، مقدار این فیلد نیز به زمان جاری تنظیم میشه.
در زمان بازیابی رکورد(ها)، مقدار این فیلد timestamp نیز همراه با رکوردها بازیابی میشه. در هنگام آپدیت، مقدار timestamp رکورد بازیابی شده با مقدار اصلی timestamp رکورد مذبور در دیتابیس مقایسه میشه.
اگر برابر نبودند مشخص میشه که رکورد، همان لحظه توسط فرد دیگه ای آپدیت شده.

موفق باشید.