ورود

View Full Version : سوال: چگونگی پیاده سازی مراحل خرید محصول در وب



mehrdad201
دوشنبه 28 مرداد 1392, 10:20 صبح
عرض سلام و ادب خدمت همه دوستان گرامی

یه سوالی برای من پیش اومده در مورد پیاده سازی مراحل خرید یه محصول در وب سایت

موضوع این هست که یه سایتی باید طراحی بشه که هدفش فروختن یه سری کوپن تخفیف محصولات هست.
اولین و مهمترین ویژگی این کوپن ها این هست که تعداد اونها در 99 درصد موارد محدود هست. مثلا کوپن خرید لپتاپ فقط 20 عدد موجود هست.


حالا فرض رو بر این میذاریم که یک وب سایتی طراحی شده که قراره این کوپن ها در اون به فروش برسه.

من سوالم اینجاست که چطوری باید مراحل خرید اجناس (که از نظر تعداد محدود هستند) رو در یک سایت پیاده سازی کرد که مشکلی پیش نیاد.

مشکل از اون جهت که فرضا خریدار وارد سایت میشه و مراحل خرید رو اغاز میکنه .
ممکنه خرید با موفقیت به پایان برسه و خب خطایی رخ نده.
اما ممکنه طرف مبلغ رو پرداخت بکنه ولی در انتهای کار (به دلیل احتمال همزمانی خرید همون کوپن) سیستم نتونه کوپنی اختصاص بده و بگه کوپن ها تموم شده . اونوقت چه اتفاقی میفته. طرف خرید رو انجام داده و پول هم داده اما اخر کار میبینه محصولی نمونده.

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

ممنون میشم دوستانی که اگاهی دارند برای بنده توضیح بدن که برای پیاده سازی فرایند خرید اجناسی که تعدادشون محدوده در یک وب سایت باید چه دقیقا چطوری عمل کرد؟
این اسکریپتهای فروشگاهی که اپشن تعداد محدود هم دارند چطوری این فرایند رو کنترل میکنند ؟

سپاسگذارم از لطف همه دوستان

بهزاد علی محمدزاده
دوشنبه 28 مرداد 1392, 13:52 عصر
سلام . این و توی بخش Design پرسیدین . بهتر بود با هر زبانی که کار می کنید توی همون بخش مطرح می کردین تا پاسخ های بیشتری دریافت می کردین . برای پیاده سازی اینها دنبال مباحث Transaction و Trigger در دیتابیس برید .
Transaction یا تراکنش امکانی هست در سمت دیتابیس که یه مجموعه عملیات یا همه با موفقیت انجام میشه و یا نه . مثلا اگر وسط کار اینترنت طرف قطع بشه و خلاصه همون مشکلاتی که مطرح کردید به وجود بیاد . عملیات مورد نظر اگر تا آخر و با موفقیت ( Commit ) به پایان رسیده باشه که به روز رسانی های انجام میشه وگرنه ثبت نخواهد شد .

Trigger هم امکانی هست که می تونید در سطح دیتابیس پیاده سازی کنید و بگید بعد از خرید کوپن برو در جدول و فیلد مربوطه یک واحد از تعداد کو‍پن ها کم کن . در مورد این دو تا تحقیق کن . این لینک
و من یه جستجو زدم . (http://www.php-jquery.ir/205/%D9%82%D8%A7%D8%A8%D9%84%DB%8C%D8%AA-transaction-%D9%BE%D8%A7%DB%8C%DA%AF%D8%A7%D9%87-%D8%AF%D8%A7%D8%AF%D9%87-%DA%86%DB%8C%D8%B3%D8%AA-%DA%86%DA%AF%D9%88%D9%86%D9%87-%D8%A8%D8%A7%DB%8C%D8%AF-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%DA%A9%D8%B1%D8%AF%D8%9F)

mehrdad201
دوشنبه 28 مرداد 1392, 17:36 عصر
چون سیستم وب سایت هست در بخش طراحی وب پرسیدم.

دیتابیس مورد نظر mysql هست و فکر میکنم در mysql سیستم کامیت ترانزکشن و رولبک نداشته باشیم.

مساله مم اینجاست که فرض کنید 2 نفر همزمان شروع کنن به خرید . منتها یکی با سرعت بیشتر و دیگری با سرعت کمتر. یکی 5 عدد کوپن میخواد بخره و یکی 2 عدد. در سیستم هم فقط 6 عدد کوپن باقیمونده.

حالا هر 2 نفر مراحل رو طی میکنن. نفر اول که سریعتر 5 رو میزنه و میره پرداخت رو انجام میده. نفر دوم که کند تره 2 روز میزنه و میره پرداخت رو انجام میده. در این لحظه خرید نفر اول تموم میشه ، پس تعداد کوپن های باقیمونده میشه 1 دونه. الان نفر اول خریدهاش با موفقیت انجام شده اما نفر دوم که در وسط خرید بوده و پول 2 تا کوپن رو داده و مرحله پرداخت رو هم رد کرده با این اتفاق مواجه میشه که 1 دونه کوپن بیشتر باقی نمونده.

حالا باید چه کرد ؟

و اینکه اصلا چطور باید فرایند رو پیاده کرد که این اتفاق رخ نده.

بهزاد علی محمدزاده
دوشنبه 28 مرداد 1392, 19:13 عصر
من تجربه پیاده سازی این و نداشتم . اما در تراکنش ها تکنیک هایی هست که میشه از اونها استفاده کرد . Locking technique و Timestamping . وقتی نفر اول برای خرید رفت به درگاه میشه جدول ( های ) مرتبط رو قفل کرد و یه زمان بهش اخصاص داد . نفر دوم نمی تونه خرید کنه میشه این کار رو با چک کردن قفل بودن یا نبودن جدول مربوطه انجام داد . در سمت رابط هم با پیغام مناسب به این موضوع و به کاربر اطلاع بدین . MySQL اون امکانات رو داره . کلاس PDO PHP هم فکر کنم توابعی برای این کار داشته باشه ( اگر با این زبان کار می کنید ... )

خود تراکنش هم دو مفهوم داره به نام Serial schedule و Concurrent schedule . کار شما با Serial راه میوفته . جتسجوهایی هم انجام دادم برای Serializable و مطالبی در موردش هست . به هر حال ببخشید که من چون تجربه پیاده سازی شو ندارم بیشتر از این نتونستم راهنمایی کنم . وقت هم نبود که یه نمونه رو انجام بدم . امیدوارم دوستانی که این و نوشتن بتونن کمک کنن .

mehrdad201
دوشنبه 28 مرداد 1392, 23:10 عصر
از توجه شما به سوال بنده بسیار ممنونم.

راستش سیستم روی بستر PHP هست اما سیستم دروپال هست و من باید به این سی ام اس این قابلیت رو اضافه کنم که باید در موردش تحقیق کنم ببینم چطوریه.

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

بازم از توجه شما ممنونم