تراکنش یا معاملات - Transactions - در لاراول

11 اردیبهشت 1400, خواندن در 3 دقیقه

تراکنش ها (Transactions) چیزیه که شاید شنیده باشید اما فکر میکنم برنامه نویسان تازه کار خیلی کم و شاید هیچ وقت ازش استفاده نمیکنند!
از اونجایی که در این مورد هیچ مطلبی توی راکت ندیدم پس تصمیم گرفتم این رو با شما به اشتراک بزارم.

چرا از تراکنش ها استفاده کنیم
اگر بخوام به زبان ساده بگم براتون یک وقت هایی پیش میاد تو برنامه، که اضافه، ویرایش و یا حذف کردن رکوردهای پایگاه داده مون بسیار وابسته به یک اتفاق دیگر در پایگاه داده است که اگر یک کدوم از این ها به درستی انجام نشه اون یکی کوئری هم نباید انجام بشه
مثلا یک سیستم مالی رو در نظر بگیرید.
تو این سیستم مالی کاربران ما میتونن از کیف پول خودشون به کیف پول کاربر دیگه ای در سیستم، پول انتقال بدن.
خوب من میام خیلی ساده این کارو انجام میدم:

$user1 = User::find(1);
$user1->update([
    'wallet' => $user1->wallet - 10000
]);

$user2 = User::find(2);
$user2->update([
    'wallet' => $user2->wallet + 10000
]);

نکته: میدونم که راه های دیگه هم برای کم و زیاد کردن اعداد وجود داره اما من تمرکزم در این مقاله روی تراکنش ها هست و فقط دارم در ابتدایی ترین روش ممکن کد رو مینویسم

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

اینجاست که Transactions به داد ما میرسه و به ما این اطمینان رو میده که در هر شرایطی، یا همه اتفاق هایی که باید، به صورت صحیح می افته و یا همه چیز به روز اولش برمیگرده

بسیار خب وقتشه کد بالا رو بیاریم تو Transaction

DB::transaction(function () {
    $user1 = User::find(1);
    $user1->update([
        'words' => $user1->words - 10000
    ]);

    $user2 = User::find(2);
    $user2->update([
        'words' => $user2->words + 10000
    ]);
});

میتونیم در پارامتر دوم این متد، تعداد دفعاتی که باید تلاش کنه تا تراکنش رو برامون انجام بده رو هم مشخص کنیم، مثلا میگیم تا 5 بار تلاش کن:

DB::transaction(function () {
    $user1 = User::find(1);
    $user1->update([
        'words' => $user1->words - 10000
    ]);

    $user2 = User::find(2);
    $user2->update([
        'words' => $user2->words + 10000
    ]);
}, 5);

اگر هم بخوایم از Transactions به صورت دستی استفاده کنیم و در شرایط متفاوت تراکنش رو اعمال و یا رد کنیم میتونیم از

DB::beginTransaction()

استفاده کنیم و هرجایی که لازم شد اونو با

DB::commit()

اعمال کنیم و یا با

DB::rollBack()

ردش کنیم.

کد بالا رو به روش دوم مینویسم:

DB::beginTransaction();
try {
    $user1 = User::find(1);
    $user1->update([
        'words' => $user1->words + 10000
    ]);

    $user2 = User::find(2);
    $user2->update([
        'words' => $user2->words - 10000
    ]);
    DB::commit();
}catch (\Exception $e) {
    DB::rollBack();
}
چه امتیازی به این مقاله می دید؟
خیلی بد
بد
متوسط
خوب
عالی

دیدگاه‌ها و پرسش‌ها

برای ارسال دیدگاه لازم است، ابتدا وارد سایت شوید.

در حال دریافت نظرات از سرور، لطفا منتظر بمانید

در حال دریافت نظرات از سرور، لطفا منتظر بمانید

آفلاین
user-avatar
مهدی شاه عباسیان @mehdi.shahabbasian
من مهدی متولد 1368 هستم. حل مسئله و چالش‌های پیش روی آن جذابیت کار منه، عاشق برنامه‌نویسی‌ام و علاقه خاصی به کامپیوتر دارم. از سنین کودکی کارکردن رو ش...
دنبال کردن

گفتگو‌ برنامه نویسان

بخشی برای حل مشکلات برنامه‌نویسی و مباحث پیرامون آن وارد شو