dashti011
یک شنبه 11 بهمن 1394, 16:29 عصر
سلام دوستان، من یه برنامه نوبت دهی دارم که از دو بخش تشکیل شده 1:سرور 2 : کلاینت
سرور : سرور رو به صورت مالتی ترد نوشتم و دیتابیس هم به کمک Entity Framework Code-first ایجاد کردم و از طریق سوکت پروگرمینگ با کلاینت ها در ارتباطه.روش کار به این صورته که کلاینت ها به تعداد نامعین ( از یکی بیشتر) به سرور وصل میشن و در طرف سرور هر کلاینت در ترد جداگانه پردازش میشه و میره اطلاعاتی رو از دیتا بیس میخونه و به هر کلاینت جواب مد نظر رو بر میگردونه یکی از این پردازش ها درخواست نوبت در صف هست که در دیتابیس در جدولی به نام گزارش روزانه ، من یه سری نوبت دارم با فیلد هایی به نام شماره نوبت ، وضعیت
یعنی مثلا نوبت های زیر در دیتا بیس هست ( البته این نمونه خیلی ساده هست ....در عمل متفاوته )
ای دی >شماره نوبت> وضعیت
1> 150 >فراخوانی شده
2 >151 >درصف
3 >152 >درصف
4> 153 >درصف
وقتی کلاینتها همزمان به سرور وصل میشن و درخواست نوبت رو به سرور میدن ، هر کلاینت در یک ترد جدید قرار میگیره و در پردازش میره به سمت دیتا بیس و با کمک دستور FirstOrDefualt میره اولین نوبتی که وضعیت اون " درصف" هست رو پیدا میکنه و به کلاینت میفرسته و قبل از ارسال عدد به کلاینت ، وضعیت نوبت را به نام "فراخوانی شده" تغییر میده ،در 90 درصد مواقع تا این جا که مشکلی نیست ظاهرا، اما مشکل وقتی پیش میاد که وقتی دو یا چند کلانت همزمان درخواست نوبت رو به سرور میفرستن سرور به هر دو کلاینت عدد 151 رو برمیگرونه در صورتی که با درخواست اول باید وضعیت عدد 151 به "فراخوانی شده" تغییر پیدا کنه و به کلاینت اول فرستاده شده باشه و برای کلاینت دوم که قاعدتا با چند میلی ثانیه اختلاف ،درخواست نوبت داده، عدد 152 که در وضعیت "درصف" قرار داره رو برگردونه ولی این اتفاق بعضی وقت ها اشتباه رخ میده و عدد یکسان رو برمیگردونه
اگر لازمه من جدول دیتا بیس و کد رو بذارم ، ممنون میشم منو راهنمایی کنید
سرور : سرور رو به صورت مالتی ترد نوشتم و دیتابیس هم به کمک Entity Framework Code-first ایجاد کردم و از طریق سوکت پروگرمینگ با کلاینت ها در ارتباطه.روش کار به این صورته که کلاینت ها به تعداد نامعین ( از یکی بیشتر) به سرور وصل میشن و در طرف سرور هر کلاینت در ترد جداگانه پردازش میشه و میره اطلاعاتی رو از دیتا بیس میخونه و به هر کلاینت جواب مد نظر رو بر میگردونه یکی از این پردازش ها درخواست نوبت در صف هست که در دیتابیس در جدولی به نام گزارش روزانه ، من یه سری نوبت دارم با فیلد هایی به نام شماره نوبت ، وضعیت
یعنی مثلا نوبت های زیر در دیتا بیس هست ( البته این نمونه خیلی ساده هست ....در عمل متفاوته )
ای دی >شماره نوبت> وضعیت
1> 150 >فراخوانی شده
2 >151 >درصف
3 >152 >درصف
4> 153 >درصف
وقتی کلاینتها همزمان به سرور وصل میشن و درخواست نوبت رو به سرور میدن ، هر کلاینت در یک ترد جدید قرار میگیره و در پردازش میره به سمت دیتا بیس و با کمک دستور FirstOrDefualt میره اولین نوبتی که وضعیت اون " درصف" هست رو پیدا میکنه و به کلاینت میفرسته و قبل از ارسال عدد به کلاینت ، وضعیت نوبت را به نام "فراخوانی شده" تغییر میده ،در 90 درصد مواقع تا این جا که مشکلی نیست ظاهرا، اما مشکل وقتی پیش میاد که وقتی دو یا چند کلانت همزمان درخواست نوبت رو به سرور میفرستن سرور به هر دو کلاینت عدد 151 رو برمیگرونه در صورتی که با درخواست اول باید وضعیت عدد 151 به "فراخوانی شده" تغییر پیدا کنه و به کلاینت اول فرستاده شده باشه و برای کلاینت دوم که قاعدتا با چند میلی ثانیه اختلاف ،درخواست نوبت داده، عدد 152 که در وضعیت "درصف" قرار داره رو برگردونه ولی این اتفاق بعضی وقت ها اشتباه رخ میده و عدد یکسان رو برمیگردونه
اگر لازمه من جدول دیتا بیس و کد رو بذارم ، ممنون میشم منو راهنمایی کنید