PDA

View Full Version : سوال: مشکل قدیمی همزمانی و جند سوال مهم



hooooman
پنج شنبه 11 مهر 1387, 20:15 عصر
سلام
1 جدول هستش که 1 رکورد بیشتر نداره . اون رکورد 1 فیلد عددی داره. حالا یوزرها برای شماره سریال 1 فرمی مقدار این فیلد رو بر میدارن یکی بهش اضافه میکنن و بعنوان سریال برمیدارن و جدول رو با این شماره جدید آپدیت میکنن . حالا سوال من اینه که چطوری باید زمانی که 1 کاربر داره این عملیات رو انجام میده این رکورد قفل بشه . من از Sp استفاده نمیکنم و پایگاهم SQL2000 هستش و از CommandBuilder هم استفاده میکنم . خواهش میکنم راهنمایی کنین . و سوال دومم هم شبیه همین مشکل هست . شما 1 سیستم حسابداری رو در نظر بگیرین . 1 یوزر داره سند حسابداری میزنه . 1 کد از جدول کدهای معین انتخاب میکنه و در Textbox مربوطه وارد میکنه. حالا اگه 1 یوزر دیگه در همین موقع که یوزر اول این کد رو انتخاب کرد اون معین رو حذف کنه افتضاح به بار میاد . شرایط کار هم مثل مورد اوله . عدم استفاده از Sp پایگاه SQL2000 و استفاده از CommandBuilder.

rooshan2008
پنج شنبه 11 مهر 1387, 21:22 عصر
جدول شما یه رکورد داره و اینکه یه رکوردی باقی می مونه؟

hooooman
پنج شنبه 11 مهر 1387, 22:48 عصر
جدول شما یه رکورد داره و اینکه یه رکوردی باقی می مونه؟


بله دیگه , 1 رکورد داره فقط فیلد شماره در این رکورد هر بار آپدیت میشه

rooshan2008
پنج شنبه 11 مهر 1387, 23:06 عصر
من خودم قبلاً این مشکل رو داشتم ولی این طوری حلش کردم :
این که یک رکورد رو قفل کنیم روش درستی نیست چون اگه یه کاربری این رکورد رو مدت طولانی در دست بگیره بد می شه ....

...
روش اول
برای جلوگیری از برخورد در جدول تک رکوردی در انتخاب کد می تونی از یه جدول رزرو استفاده کنی این طوری که می تونی شماره که جدید در اختیار کاربر قرار گرفته تو یه جدول دیگه ثبت می شه و شما حالا شماره های استفاده شده رودارید وبرای درخواست بعدی باید از جدول رزرو استعلام بگیرید و شماره جدیدی که در جدول رزرو وجود ندارد را در جدول رزرو ثبت کنید و این شماره را به کاربر نمایش دهید در این صورت این شماره فقط برای کاربر مورد نظر اختصاص داده میشه

البته من جواب گرفتم ولی نمی دونم تونستم منظورم رو برسونم

hooooman
جمعه 12 مهر 1387, 00:15 صبح
دوستان میدونین عمده مشکل من چیه؟
شما 1 سیستم حسابداری رو در نظر بگیرین . وقتی کاربر 1 سند باز میکنه در قسمت کد معین 1 کدی رو انتخاب میکنه که قاعدتا این کد در جدول کدینگ معین قرار داره وگرده اصلا برنامه اجازه ورودش رو نمیده. حالا تا وقتی این سند بسته نشده یعنی ذخیره نشده گردش مالی این سند ایجاد نمیشه که مشخص بشه اون کد معین گردش داره و امکان اصلاح یا حذف نداره . حالا فرض کنین وقتی یوزر 1 داره 1 سند میزنه یوزر دومی اون کد معین رو از جدول معینها حذف میکنه . اینجاس که میگم افتضاحی میشه تاریخی . کسی راه حلی پیشنهاد میکنه؟

bardia goharbin
جمعه 12 مهر 1387, 00:24 صبح
این مشکل بستگی مستقیم به نحوه برنامه نویسی شما داره.
مشکلی که شما ذکر میکنید برای خیلی از برنامه ها امکان داره پیش بیاد. ولی باید کنترل خاصی روی این موارد توسط برنامه نویس انجام بشه. مثلا در خصوص مشکل شما میشه اینطور گفت که وقتی قصد ذخیره نهایی سند رو دارید میتونید دوباره موجودیت کدها رو همون لحظه چک کنید و هرکدی حذف شده بود اخطار بدهید و سند رو ثبت نهایی نکنید و اگر مشکلی نبود سند رو ذخیره کنید و وقتی هم که از کد معینی استفاده شده بود، اجازه حذف آن کد را از کابران بگیرید.

hooooman
جمعه 12 مهر 1387, 00:33 صبح
این مشکل بستگی مستقیم به نحوه برنامه نویسی شما داره.
مشکلی که شما ذکر میکنید برای خیلی از برنامه ها امکان داره پیش بیاد. ولی باید کنترل خاصی روی این موارد توسط برنامه نویس انجام بشه. مثلا در خصوص مشکل شما میشه اینطور گفت که وقتی قصد ذخیره نهایی سند رو دارید میتونید دوباره موجودیت کدها رو همون لحظه چک کنید و هرکدی حذف شده بود اخطار بدهید و سند رو ثبت نهایی نکنید و اگر مشکلی نبود سند رو ذخیره کنید و وقتی هم که از کد معینی استفاده شده بود، اجازه حذف آن کد را از کابران بگیرید.


خب در حال حاضر من همین کارو میکنم . ولی بنظرم 1 جورایی خیلی منطقی نیست

bardia goharbin
جمعه 12 مهر 1387, 00:38 صبح
اتفاقا به نظر من یه جورایی غیرمنطقیه ولی تا اونجایی که من می دونم درعمل راه حل دیگه ای براش وجود نداره. البته من فکر میکنم شما اون کنترل نهایی رو انجام نمیدی و وقتی جزئیات سند حسابداری رو کاربر وارد میکنه همون موقع کدمعین رو چک میکنی در صورتیکه وقتی میخوای سند رو ثبت نهایی کنی یه بار دیگه همون لحظه چک کن. این تنها چیزیه که به نظر من میرسه.
البته اساتید بزرگی توی این سایت حاضر هستن، امیدوارم یه نگاهی به اینجا بندازن و اگه راه حل منطقی تری وجود داره حتما بگن که ما هم استفاده کنیم.