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

Django Transactions

توی این قسمت، راجب Transaction atomic گفته شد، این سری تصمیم گرفتم که جزئیات بیشتری رو راجب Transaction بخونم و بیام توضیحاتی رو راجع بهش بنویسم و به همراه مثال:)


۱- مفهوم ATOMIC_REQUESTS

یکی از ویژگی های جنگو، استفاده از ATOMIC_REQUESTS هستش که بعد از هر درخواست HTTP به طور خودکار داخل یک تراکنش قرار میگیره. این یعنی اینکه اگه درخواست بدون خطا انجام بشه،‌تغییرات روی دیتابیس commit میشه و اگه خطا رخ بده، همه تغییرات rollback میشن. این ویژگی تضمین میکنه که تغییرات به صورت atomic انجام بشن و از بروز خطا دیتا جلوگیری بشه.

مثال:

اول از همه نیازه که ATOMIC_REQUESTS رو داخل تنظیمات پروژه فعال کنیم:

یک ویو ساده براش بخوایم در نظر بگیریم:

توی این مثال اگه خطایی رخ بده همه تغییرات به طور خودکار بازگردانی میشن.

۲- استفاده از atomic()

اگه بخوایم تمرکز و دقت بیشتری روی جزئیات تراکنش ها داشته باشیم میتونیم از atomic decorator استفاده کنیم. بهمون کمک میکنه که بخشی از کدمون رو اتمیک پیش ببریم به این معنی که اگه کد بدون مشکل اجرا شد تغییرات ذخیره بشن و اگه خطایی پیش اومد rollback بخوره.

بلوک های atomic میتونن تو در تو باشن. یعنی میتونیم چندین سطح از تراکنش های اتمیک داشته باشیم ولی اگه بلوک بیرونی خطا رخ بده، حتی اگه بلوک داخلی به درستی پیش رفته باشه همه تغییرات rollback میخورن.

۳- مفهوم on_commit()

گاهی اوقات تصمیم میگیریم که بعد از اینکه commit با موفقیت انجام شد کار خاصی انجام بشه. به طور مثال میخوایم که در صورت ذخیره موفق اطلاعات، یک ایمیل بفرستیم. اینجاست که on_commit() بهمون کمک میکنه:

۴- مفهوم savepoint

گاهی پیش میاد که تصمیم بگیریم که داخل یک تراکنش بزرگ،‌فقط بخشی از تغییرات rollback بشن، نه کل تراکنش. اینجاست که میتونیم از savepoint استفاده کنیم.

با ایجاد یک savepoint در یک تراکنش هروقت بخوایم میتونیم به همون نقطه برگردیم، بدون اینکه کل تراکنش rollback بشه.

وقتی که atomic() به صورت تو در تو استفاده بشه، به صورت خودکار یک savepoint ایجاد میکنه تا امکان commit یا rollback جزئی فراهم بشه.

داخل این مثال اگه تصمیم بگیرین که b رو نگه ندارین،‌میتونین تنها به نقطه savepoint برگردین و بقیه تراکنش ها دست نخورده باقی بمونن.

  • اگه داخل یک بلوک atomic() از savepoint استفاده کنین و خطایی رخ بده، کل بلوک rollback میخوره
  • میتونین با get_rollback() و set_rollback() کنترل بیشتری روی رفتار rollback داشته باشین.

امیدوارم که براتون مفید بوده باشه:)

داکیومنت Django

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