Transaction چیست؟
Transaction
تو این مقاله به یکی از پایهایی ترین مفاهیم دیتابیس یعنی Transaction میپردازیم.
Transaction چیه؟
Transaction به ما این قابلیت رو میده تا بتونیم چندین عملیات رو در قالب یک واحد یابهتر بگم یک بلوک اجرا کنیم.
ما میتونیم چندین عملیات Read - Write رو با یک ترنزکشن انجام بدیم.
خب حالا سوالی که پیش میاد اینکه که چرا باید این کار رو بکنیم؟
وقتی که میخوایم از صحت و کامل اجرا شدن یک عملیات مطمئن باشیم به شکلی که اگر اون عملیات کامل اجرا نشه اصلاً نمیخوایم اجرا بشه
**NOTE:**همیشه تو آموزشها هم تأکید بر اینه که مثالهای واقعی داشته باشم که مخاطب هم درک بهتری از موضوع داشته باشه
بهترین مثال برای این موضوع فرض کنید از حساب بانکی من میخواد صد تومن برداشت بشه و به حساب شما اضافه بشه
عملیات ها به این شکل میشه:
- مقدار موجودی من خوانده میشه
- 100 تومن از موجودی من کم میشود
- 100 تومن به موجودی شما اضافه میشود
حالا فرض کنید بعد از انجام مرحله ۲ برای دیتابیس مشکلی پیش میاد. پول از حساب من گرفته شده و به حساب شما اضافه نشده. این یعنی صد تومن گم شده. بدترین اتفاقی که میتونه بیفته
حالا اگه این رو در قالب یک تراکنش(Transaction) بذاریم حتی اگه پول از حساب من برداشت بشه عملیات برگشت(Roll back)میخوره. در واقع ترنزکشن باعث میشه consistency به سرویس ما بیاد
اگر هم عملیات موفق باشد، پول به حساب من پول از حساب من کسر میشه و به حساب شما اضافه میشه. دیتابیس ترنزکشن را با BEGIN شروع می کند، با COMMIT میبندد. و بین این دو مورد هم باقی عملیاتها انجام میشه. نمونه کد دیتابیسی رو هم داریم میبینیم
BEGIN; --- شروع Transaction
UPDATE accounts
SET balance = balance - 100
WHERE id = 1;
UPDATE accounts
SET balance = balance + 100
WHERE id = 2;
COMMIT;--- پایان Transactionپس Transaction در دیتابیس ها به این شکل هستن:
BEGIN: از این لحظه اگر تغییری اتفاق بیفته برای باقی connection ها قابل رویت نیست
COMMIT: در این لحظه تغییرات بر روی دیتابیس اعمال و ماندگار میشن
Rollback: تمام عملیات هایی که از لحظه Begin شروع شدن لغو میشن و برمیگردن به حالت قبل
همچین چیزیه:
باید و نباید ها در Transaction
- تراکنش هارو کوتاه نگهدار
- فقط منطق های همون کار رو انجام بده(نزار تعداد statement ها زیاد بشه)
- وسط Transaction نرو یه Api خارجی call کنی و کاری جز عملیات های دیتابیسی انجام نده
کلا سعی کن connection زیاد باز نمونه
- ست کردن statement_timeout هم فراموش نشه
من صفحه های دیگه ایی هم دارم:
Related Posts
2026-09-18
2026-09-20