Transaction (ترنزکشن‌)

در برنامه‌نویسی، Transaction معمولاً به فرایند تبادل یکسری داده‌ها و تَسک‌های مرتبط با آن‌ها همچون آپدیت یکسری رکورد در دیتابیس گفته می‌شود که این اطمینان را حاصل می‌کند که ریکوئست (درخواست) مد نظر بدون هیچ‌گونه کم و کاستی با صحت کامل انجام خواهد شد. به منظور تکمیل شدن یک ترنزکشن و دائمی شدن تغییرات اعمال شده در دیتابیس، ترنزکشن‌ها باید به طور کامل و دقیق انجام شوند.

برای مثال، یک مشتری را در نظر بگیرید که با فروشگاهی تماس می‌گیرد و کالایی را سفارش می‌دهد. اپراتور هم سفارش مذکور را در کامپیوتر ذخیره می‌سازد. در چنین شرایطی، ترنزکشن مرتبط با این سفارش شامل ارتباط برقرار کردن با دیتابیس مرتبط با موجودی کالاها، تأیید اینکه آیتم مورد نظر مشتری موجود است، ثبت سفارش به نام مشتری و تأیید اینکه سفارش به درستی به نام مشتری ثبت شده است می‌شود. اگر این عمل را به عنوان یک ترنزکشن حساب کنیم، در نتیجه قبل از اینکه ترنزکشن موفقیت‌آمیز باشد و در واقع دیتابیس برای نشان دادن سفارش جدید تغییر کرده باشد، باید تمام گام‌ها به ترتیب انجام شوند. همچنین اگر قبل از اینکه ترنزکشن با موفقیت کامل شود اتفاقی رخ دهد، هر تغییری در دیتابیس باید Track (رصد) شود تا بتوان آن را لغو کرده و تغییرات صورت گرفته را به حالت قبل برگرداند.

یکی از متداول‌ترین موارد استفادهٔ ترنزکشن‌ها، در عملیات بانکی است که فرآیند آن بدین صورت است که ابتدا حساب فرد از نظر وجود داشتن و بلوکه نبودن بررسی می‌شود، سپس موجود بودن مبلغ درخواستی جهت انتقال، برداشت، خرید و ... بررسی می‌شود و در صورت موجود بودن، در مرحلهٔ بعد مبلغ موجودی فرد تغییر می‌کند و مثلاً اگر درخواست برداشت وجه از ATM داشته باشد، وجه به وی پرداخت می‌شود و این در حالی است که این عملیات خیلی سریع و در حد چند ثانیه رخ می‌دهد و مشتری هرگز متوجه نمی‌شود.

به صورت کلی کاربرد ترنزکشن هنگامی است که بخواهیم چند تَسک مرتبط را انجام دهیم و اگر هر کدام از این تَسک شکست خورد، این به منزلهٔ شکست کل ترنزکشن هست و باید بازگشت تغییرات یا به اصلاح Rollback انجام دهیم.

یک برنامه که دنباله‌ای از رویدادها را مدیریت یا نظارت می‌کند که بخشی از ترنزکشن هستند، Transaction Monitor نیز نامیده می‌شود. به علاوه اینکه زبانی همچون Structured Query Language یا به اختصار SQL به خوبی از ترنزکشن‌ها پشتیبانی می‌کنند. وقتی یک تراکنش با موفقیت تکمیل می‌شود، گفته می‌شود تغییرات دیتابیس Commit شده‌اند؛ اما هنگامی که یک ترنزکشن کامل نشود، تغییرات اصطلاحاً Rollback می‌شوند. به عنوان یک مثال از کاربرد ترنزکشن در MySQL داریم:

try {
    // First of all, let's begin a transaction
    $db->beginTransaction();

    // A set of queries; if one fails, an exception should be thrown
    $db->query('first query');
    $db->query('second query');
    $db->query('third query');

    // If we arrive here, it means that no exception was thrown
    // i.e. no query has failed, and we can commit the transaction
    $db->commit();
} catch (Exception $e) {
    // An exception has been thrown
    // We must rollback the transaction
    $db->rollback();
}

همان‌طور که مشاهده می‌شود، از یک بلوک try و catch استفاده کرده‌ایم؛ ترنزکشن در خط سوم شروع می‌شود و تعدادی کوئری به سمت دیتابیس ارسال می‌کنیم (خطوط ششم تا هشتم) و در نهایت در خط دوازدهم تغییرات را کامیت می‌کنیم. حال اگر بنا به هر دلیلی مشکلی به وجود آید، برنامه وارد بلوک catch شده و کلیهٔ تغییرات را به حالت قبل بازمی‌گردانیم یا اصطلاحاً رول‌بک می‌کنیم.

online-support-icon