حل مشکل Race Condition توی جنگو

داشتم یه اپلیکیشن ساده جَنگو رو می‌ساختم که با یه مشکل به اسم Race Condition برخوردم. خیلی چیز جالب و در عین حال ساده‌ایه که باید حتما حتما حل بشه. خب منبع این آموزش کوچولو موچولو وبسایت اصلی Django هستش و توی آخر همین پست لینکش رو گذاشتم.

قضیه از چه قراره؟! تصور کنید که یه وبسایت فروشگاهی دارید که توش میخواید یه مداد بفروشید. تعداد مدادهای موجودتون ۱۰ تا هستش. منطق برنامه شما به این صورته که به ازای هر فروش یک عدد از مقادیر موجودتون کم میشه. پس من اگه بیام یه مداد بخرم میشه ۹ تا.

ولی وقتی من میام یه مداد می‌خرم دقیقا چه چیزی اون پشت مشتا اتفاق می‌افته. خیلی ساده است: بانک اطلاعاتی میاد اول مقدار موجود رو می‌گیره و اون رو میبره تو رَم، براساس منطق برنامه میاد یه دونه کم میکنه پس مقدار ۱۰ توی رم میشه ۹ و در نهایت object.save() … مقدار توی بانک اطلاعاتی ذخیره میشه.

حالا یه مشکلی که پیش میاد توی این حالت چیه؟ اینکه اگه دو نفر همزمان داشتن یه مداد میخریدن چه اتفاقی می‌افته.

نفر ۱: بانک اطلاعاتی ۱۰ رو گذاشته توی رم و یکی ازش کم میکنه و مقدار میشه ۹ و ذخیره می‌کنه.

نفر ۲: بانک اطلاعاتی ۱۰ رو گذاشته توی رم و یکی ازش کم میکنه و مقدار میشه ۹ و ذخیره می‌کنه.

وقتی انبار رو نگاه می‌کنی می‌بینی ۸ تا مداد داری ولی بانک اطلاعاتی میگه ۹ تا داری! اینجوریه که برنامه شما خطا میره  ☺😉🙃

راه‌حلش چیه؟! خب این مطلب می‌خواد همین رو بگه. برای حل این مشکل کافیه از یه F() expression هستش:

اول بیایید اون رو import کنید:

F() به ما این قابلیت رو میده که قبل از ذخیره داده یا همون object.save() توی بانک اطلاعاتی، اون فیلد یا آبجکتی که می‌خوایم ذخیره بشه رو بروزرسانی کنیم. اینطوری دیگه مشکل Race Condition رو نداریم.

برای استفاده از این حالت می‌تونید توی تعریف View به صورت زیر کار بکنید:

خیلی ساده و خوشمزه 😉

موسیقی این مطلب هم یک کار از نوازنده جَز Django Reinhardt:

منتشرشده توسط

ارسطو عباسی

یه نویسنده، وبلاگ‌نویس و توسعه‌دهنده خودآموخته‌ام. کسی که به هنر، برنامه‌نویسی، علوم، فلسفه، ریاضیات، ادبیات و مسافرت خیلی علاقه داره و هر روز سعی می‌کنه که چیزهای جدیدی رو یاد بگیره.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *