PDA

View Full Version : کنترل ظرفیت کلاس



pswin.pooya
جمعه 08 مهر 1390, 20:44 عصر
سلام
من یه برنامه برای ثبت نام کارگاه ها نوشتم. حالا هر کارگاه یه ظرفیت داره که با فیلد workshop.cap مشخص میشه و یه شناسه به اسم wid داره. از طرف دیگه پرسنلی که ثبت نام میکنن یه مشخصه به اسم eid دارن حالا زمان ثبت نام مشخصات (eidوwid) داخل یک جدول به اسم mark ثبت میشه. چه شکلی میشه ظرفیت کلاسها رو کنترل کرد به شکلی که از تعداد مشخص شده بیشتر نشه. یعنی تعداد رکوردهای جدول mark با wid یکسان بیشتر از workshop.cap نشه.

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

mg_mahyar
جمعه 08 مهر 1390, 20:49 عصر
از دو خط اول چیزی نفهمیدم ولی میتونی یک کاری کنی .
اولا یک صف بسازی در اون صورت هر چی وارد بشه پشت هم میاد و دونه دونه بررسی میشه ظرفیت.
دوم اینکه بزاری همون -1 بشه. بعدش چک کنی اگر بود -1 اونوقت اونی که زمان اخذش دیر تر هست رو حذغ کنی تا ظرفیت 0 بشه و بعد به کاربرا اعلام کنی کی گرفته کی نگرفته.
به عبارت ساده تر شما اول درخواست ها رو بگیری بعدا ترتیب اثر بدی بعدا جواب رو اعلام کنی.

pswin.pooya
جمعه 08 مهر 1390, 20:55 عصر
از دو خط اول چیزی نفهمیدم ولی میتونی یک کاری کنی .
اولا یک صف بسازی در اون صورت هر چی وارد بشه پشت هم میاد و دونه دونه بررسی میشه ظرفیت.
دوم اینکه بزاری همون -1 بشه. بعدش چک کنی اگر بود -1 اونوقت اونی که زمان اخذش دیر تر هست رو حذغ کنی تا ظرفیت 0 بشه و بعد به کاربرا اعلام کنی کی گرفته کی نگرفته.
به عبارت ساده تر شما اول درخواست ها رو بگیری بعدا ترتیب اثر بدی بعدا جواب رو اعلام کنی.
من دقیقا دارم میگم این روش اشتباه هست. چون بعد از اون هر دو تا میتونن چک کنن و به نتیجه برسن که از ظرفیت رد شدن و هر دو تا باز هم اقدام به حذف رکورد خودشون بکنن

FastCode
جمعه 08 مهر 1390, 22:13 عصر
خطا در طراحی:
آیا یک شخص میتونه همزمان در چند کارگاه کار بکنه؟
تا اونجایی که من میدونم جواب منفیه.

mg_mahyar
جمعه 08 مهر 1390, 22:53 عصر
من دقیقا دارم میگم این روش اشتباه هست. چون بعد از اون هر دو تا میتونن چک کنن و به نتیجه برسن که از ظرفیت رد شدن و هر دو تا باز هم اقدام به حذف رکورد خودشون بکنن
ظاهرا منظور رو نگرفتید.
شما مثلا یک ظرفیت خالی دارید. قرار هست چند نفر دکمه اخذ رو بزنن و ظرفیت به یک نفر داده بشه . به بقیه هم بگید جا پر شده.
شما میگید تا اینجا رفتید که اینا میان و اخذ رو میزنن. فرض اینه که n نفر همزمان اخذ کنن. و شما ظرفیتت بشه n+1- حالا شما اگر n-1 نفر رو از اینا حذف کنید ظرفیت درست میشه.
این تعداد حذفی رو هم اینجوری بگیر که زمان گرفتن واحد رو مشخص کن. اونی که زمانش از بقیه کمتره رو نگه دار و الباقی رو حذف کن. حالا شما پیغام بده که ظرفیت پر شده به اون n-1 نفر و به یک نفر بگو ظرفیت مال شماست.
الان فقط یه نفر از ظرفین رد شده و هرچی چک کنه ظرفیت 0 شده و چیزی گیرش نمیاد

mehran_sh_t
جمعه 08 مهر 1390, 23:01 عصر
سلام. فک کنم در SQL امکانی باشه که در هر لحظه فقط یک بار کد توسط یک کاربر در دسترس باشه...

pswin.pooya
جمعه 08 مهر 1390, 23:21 عصر
آیا یک شخص میتونه همزمان در چند کارگاه کار بکنه؟
فکر کنم کلا روی مساله رو متوجه نشدید


ین تعداد حذفی رو هم اینجوری بگیر که زمان گرفتن واحد رو مشخص کن. اونی که زمانش از بقیه کمتره رو نگه دار و الباقی رو حذف کن. حالا شما پیغام بده که ظرفیت پر شده به اون n-1 نفر و به یک نفر بگو ظرفیت مال شماست.
یعنی شما میگید یه فیلد برای زمان اخذ داخل جدولم بزارم؟ این روش یه مقدار گیج کننده به نظر برسه. آخه هر کلاینت باید مسئول تراکنش خودش باشه حالا اون چه جوری باید از ماله بقیه اطلاع داشته باشه که بدونه از بقیه زودتر بوده یا دیرتر. یک کاری که میشه کرد اینه که جدول رو بر اساس زمان مرتب کنیم و بعدش رکوردهایی که بیشتر از تعداد ظرفیت هستند رو بعد از هر عمل درج حذف کنیم. بعدش باز چک کنیم و ببینیم که آیا رکورد ما وجود داره یا نه. الان که فکر بیشتر فکر کردم متوجه شدم فیلد زمان انتخاب کارگاه باید حتما توی جدول وجود داشته باشه (برای پیگیری بعدی و ...) مرسی جلوی خطای طراحی من رو گرفتید.


سلام. فک کنم در SQL امکانی باشه که در هر لحظه فقط یک بار کد توسط یک کاربر در دسترس باشه...
همیشه این شکلیه منتها مساله اینه که دو تا تراکنش جدا داریم. اگر میشد داخل دستور insert از where استفاده می کردیم این قضیه حل میشد.

mehran_sh_t
شنبه 09 مهر 1390, 00:32 صبح
همیشه این شکلیه منتها مساله اینه که دو تا تراکنش جدا داریم.
مطمئنا برای این مساله با این روش جواب وجود داره، مثلا شرکت های هواپیمایی و مسافربری و مثال های دیگه، باید از روش مشابهی استفاده کنند!