Parsa Rezaei
Parsa Rezaei
خواندن ۲ دقیقه·۸ ماه پیش

Database Transactions in Django(Atomic)

سلام،

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

این سوالی بود که در مصاحبه تکنیکال ازم پرسیده شد،‌ پیشنهادی که من دادم celery بود ولی گفتن هزینه بالایی برمیداره و نمیخوایم برنامه درگیر celery task بشه.

یکی از راه حل های خوب این ماجرا،‌ Django transaction atomic بود.




حالا به اصطلاح اتمی بودن چه کمکی میکنه؟ جنگو چک میکنه زمانی که تمام عملیات های کدی که سمت تراکنش نوشتید، موفقیت آمیز باید باشه و وقتی که مشکلی نبود، تغییرات در دیتابیس اعمال میشه. اگر به هر دلیلی exception اجرا شد جنگو roll back میزنه و تمامی تغییراتی که قرار بود انجام بشه رو کنسل میکنه و برمیگرده به حالت سابق خودش.

اتمی بودن میتونه به نوعی تودرتو(nested) باشه. یعنی اگه محیط داخلی کدتون(block code) موفقیت آمیز بود ولی بلاک خارجی به خطا خورد، باز به طور کلی جلوی تغییرات رو میگیره.

  • باعث میشه پرفورمنس حفظ بشه و بار اضافی سمت دیتابیس نباشه
  • ارور هندلینگ رو ساده تر میکنه و کمک میکنه که ارور ها راحتتر از حالت عادی بررسی بشن
  • تمامیت دیتابیس حفظ میشه و جلوی تغییرات جزئی که باعث میشه اطلاعات به خطر بیوفتن رو تا حدی میگیره

از طرفی

  • باید مراقب lock شدن دیتابیس باشید
  • خطای exception که قرار هست بنویسید با دقت روش کار کنید و خطای مناسبی سمت کاربر هدایت بشه
  • تست هایی که قرار هست براش بنویسید باید تمامی سناریو ها رو تست بکنه و خطا رو بررسی کامل بکنه



از نکات خوبی بود که دوست داشتم بابتش یک توضیح کوتاهی داده باشم و امیدوارم براتون مفید بوده باشه.

منبع: داکیومنت transaction جنگو


جنگودیتابیسtransactiondjango
یه برنامه نویس ساده که جنگو کار میکنه و جدیدا هم تصمیم گرفته راه دواپس رو پیش ببره:)
شاید از این پست‌ها خوشتان بیاید