تراکنش یا معاملات - Transactions - در لاراول
ﺯﻣﺎﻥ ﻣﻄﺎﻟﻌﻪ: 3 دقیقه

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

تراکنش ها (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();
}

چه امتیازی برای این مقاله میدهید؟

خیلی بد
بد
متوسط
خوب
عالی
4.65 از 26 رای

/@shahabbasian
مهدی شاه عباسیان
برنامه نویس

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

دیدگاه و پرسش

برای ارسال دیدگاه لازم است وارد شده یا ثبت‌نام کنید ورود یا ثبت‌نام

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

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

مهدی شاه عباسیان

برنامه نویس

مقالات برگزیده

مقالات برگزیده را از این قسمت میتوانید ببینید

مشاهده همه مقالات