PDA

View Full Version : مشکل همزمانی در انتخاب درس سیستم انتخاب واحد



M.Hashemi2007
سه شنبه 22 دی 1394, 08:16 صبح
با سلام
زیاد جستوجو کردم و به نتیجه خاصی نرسیدم پس مجبور شدم تاپیک جدید ایجاد کنم.
در سیستم انتخاب واحد اگر چند دانشجو به طور هم زمان یک درس را انتخاب کنند که تنها ۱ جای خالی دارد درس برای یک نفر ثبت می شود و به بقیه خطا می دهد که ظرفیت کامل است.
سناریو انتخاب درس به این صورت است که:

۱- بررسی می شود که آیا هنوز جای خالی وجود دارد (یعنی یک select انجام می شود)
۲- اگر جای خالی وجود داشت اطلاعات دانشجو را ثبت کن (یعنی یک insert انجام می شود)
معمولا این ۲ دستور در یک تراکنش نوشته می شوند.
اما مشکل هم زمانی به چه صورت حل می شود؟؟؟؟؟؟؟؟؟؟؟؟
یعنی اگر چند نفر همزمان درخواست بدهند چگونه باید مدیریت شوند؟؟
آیا با php باید مدیریت شوند یا mysql؟؟
ممنون می شوم جواب دهید.
باتشکر

0xEHSAN
سه شنبه 22 دی 1394, 09:18 صبح
درود در این تایپک بهش اشاره شده

http://barnamenevis.org/showthread.php?495890-Class-%D9%87%D8%A7-%D9%88-%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7-%D9%88-%D8%AA%DA%A9%D9%86%DB%8C%DA%A9-%D9%87%D8%A7%DB%8C-%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%D8%AF%DB%8C-%D8%AF%D8%B1-PHP&p=2224894&viewfull=1#post2224894

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


این لینک هم هست http://dev.mysql.com/doc/refman/5.7/en/commit.html

متاسفانه امکان تست کردن ندارم و این مثال عملیش هست http://stackoverflow.com/questions/2708237/php-mysql-transactions-examples

M.Hashemi2007
سه شنبه 22 دی 1394, 10:05 صبح
با سلام
ممنون دوست عزیز.
از پاسخگوی سریع و کاملتون.
اما یک نکته برای من هنوز روشن نیست.
تعریف transaction برای چندین دستور باعث اجرای قوانین ACID می شود و قانون A یا Atomic یا (قانون همه یا هیچ) باعث یکپارچگی دستورات می شود.
اما ما در پایگاه داده ویژگی به نام همزمانی یا concurency داریم، یعنی ممکن است چند تراکنش با هم انجام شوند و روی هم تاثیر مخرب داشته باشند.
به عنوان مثال (ببخشید مثال php و mysql را پیدا نکردم):

http://nikamooz.com/understanding-isolation-level-in-sql-server/
حالا سوال من این است برای مشکل همزمانی آیا استفاده کردن از transaction کافی است یا باید حتما از isolation level هم استفاده شود؟؟؟
** در سناریو انتخاب واحد فرض بر این است که فقط یک نفر ظرفیت دارد اما مثلا ۱۰ نفر همزمان درس را انتخاب می کنند، حالا آیا Transaction خالی جوابگو است؟؟؟
ممنون می شوم راهنمایی کنید.
با تشکر

leaping
سه شنبه 22 دی 1394, 11:11 صبح
در mysql از transaction استفاده کنید

این لینکها هم شاید به دردتون بخوره
http://stackoverflow.com/questions/1195858/how-to-deal-with-concurrent-updates-in-databases
http://stackoverflow.com/questions/10371287/how-to-manage-locks-to-prevent-a-duplicate-insert