فرض کن یه محصول داری با 1 موجودی
2نفر بیان همزمان این رو بخرن
نفر اول میگه خب 1 موجودی هست من خرید کردم باید بشه 0 جدول رو ویرایش میکنه و 0 میزاره موجودی رو
نفر دوم هم همزمان داره همین خرید رو میکنه و همین منطق رو پیاده میکنه و جدول رو ویرایش میکنه موجودی رو 0 میزنه
الان سیستم شما 1 محصول رو به 2 نفر فروخته درالی که 1 موجودی بیشتر نداره
یبار دیگه صحبت هام رو بخون برات توضیح دادم که چرا باید این روش رو استفاده کنی
شما یه روز بیای ببینی موجودی محصول 0 شده معلوم نیست که چجوری 0 شده کی کم کرده و بابت چی
یا مثلا ممکنه کسی که همزمان 2 نفر ویرایش کنن مثلا 2 تا موجودی داره 2 نفر همزمان خرید کنن
نفر اول منیگه خب موجودی2 هست و من دارم 1 دونه خرید میکنم پس موجودی باید بشه 1
نفر دوم هم همین رو میگه ... هردو موجودی رو ویرایش میکنن و 1 میزارن آخرش با اینکه 2 تا محصول خرید شده 1 دونه از موجودی کم میشه
و مشکلات اینچنینی مربوط به race condition
1 - همیشه میشه با یک نگاه متوجه شد که در چه زمان هایی و به چه دلایلی موجودی کم و زیاد شده
2 - از اونجایی که هیچوقت همزمان 2 ردیف در یک تیبل ثبت نمیتونن بشن و یکی منتظر میمونه تا اونیکی ثبت بشه اول ... مشکل همزمانی خرید یا اشتباه محاسبه شدن موجودی محصول برات پیش نمیاد و از طرف دیگه همه آپدیت هایی که روی تیبل انجام میشه همه از یک جا سرچشمه میگیره حتی اگه از جاهای مختلف استارت خورده باشه
یعنی اگه شما بیای محصول بخری یا ادمین سایت بره تو پنل ادمین موجودی ثبت کنه این از 2 جای مختلف شروع شده عملیات تغییر ولی از اونجای یکه هردوشون توی یک تیبل product_stocks میریزن و این trigger رو فعال میکنه تا بره ویرایش کنه تیبل محصولات رو این 2 عملیات سینک میشه با هم و این امکان نیست که یکی با دیگری تداخل ایجاد کنه یا باعث اشتباه محاسباتی بشه





پاسخ با نقل قول