سلام،
این سناریو رو فرض کنید: کاربر کیف پولش رو به فرض شارژ کرده و میخواد محصولی رو بخره. به هر دلیلی به خطا میخوره و با وجود اینکه از کیف پولش کسر شده، ولی محصول به حسابش اضافه نشده. چه راهکاری برای هندل کردن چنین موقعیتی وجود داره بابت برگردوندن پول به حسابش؟
این سوالی بود که در مصاحبه تکنیکال ازم پرسیده شد، پیشنهادی که من دادم celery بود ولی گفتن هزینه بالایی برمیداره و نمیخوایم برنامه درگیر celery task بشه.
یکی از راه حل های خوب این ماجرا، Django transaction atomic بود.
حالا به اصطلاح اتمی بودن چه کمکی میکنه؟ جنگو چک میکنه زمانی که تمام عملیات های کدی که سمت تراکنش نوشتید، موفقیت آمیز باید باشه و وقتی که مشکلی نبود، تغییرات در دیتابیس اعمال میشه. اگر به هر دلیلی exception اجرا شد جنگو roll back میزنه و تمامی تغییراتی که قرار بود انجام بشه رو کنسل میکنه و برمیگرده به حالت سابق خودش.
اتمی بودن میتونه به نوعی تودرتو(nested) باشه. یعنی اگه محیط داخلی کدتون(block code) موفقیت آمیز بود ولی بلاک خارجی به خطا خورد، باز به طور کلی جلوی تغییرات رو میگیره.
از طرفی
از نکات خوبی بود که دوست داشتم بابتش یک توضیح کوتاهی داده باشم و امیدوارم براتون مفید بوده باشه.
منبع: داکیومنت transaction جنگو