تعداد بازدید: 2931

تراکنش ها یا transaction در MySQL Engine

یکی از مباحث پیشرفته تر در MySQL Engine تراکنش ها (transaction) می باشد. این ها امکاناتی هستند که موتور MySQL یا MongoDB در اختیار ما قرار می دهد.

تراکنش ها – Transaction

زمانی که یک کوئری از چند قسمت وابسته و مجزا تشکیل شده است. به طور مثال کوئری خرید یک محصول از کم شدن اعتبار از خریدار و اضافه شدن به حساب فروشگاه تشکیل شده است. بدین ترتیب اگر در اجرای هر کدام از دو قسمت مشکلی بوجود بیاید در منطق کوئری اصلی مشکلی بوجود آمده و نا معتبر است.

برای این که این دو کوئری را وابسته به هم کنیم باید هر دو را در یک تراکنش قرار دهیم که در پایان با هم اجرا شوند . (START TRANSACTION, COMMIT, ROLLBACK).

START TRANSACTION;
UPDATE users SET value=1000 WHERE id=1;
UPDATE shops SET value=1000 WHERE id=1;
COMMIT;

syntax های زیر کنترل های transaction می باشد :

  • START TRANSACTION or BEGIN به معنی شروع یک تراکنش است.
  • COMMIT تایید تراکنش جاری ، اجرای دائمی کوئری ها.
  • ROLLBACK عدم اجرای تراکنش جاری ، لغو کوئری ها ( تغییرات) .

در MySQL تمامی دستورات پس از اجرا به صورت خودکار تایید و اجرا می شوند ، اما در صورتی که متغیر autocommit را برابر با 0 قرار دهیم تایید دستورات با COMMIT قطعی می شوند.

SET autocommit=0;
UPDATE users SET value=1000 WHERE id=1;
UPDATE shops SET value=1000 WHERE id=1;
COMMIT;

نکته : اگر از START TRANSACTION استفاده کنیم تنها یک بار از COMMIT , ROLLBACK می توانیم استفاده کنیم اما اگر از SET autocommit استفاده کنیم به هر تعداد دستور می توانیم از COMMIT , ROLLBACK استفاده کنیم.

نکته : مقدار این متغیر پس از قطع اتصال از MySQL به صورت خودکار برابر 1 می شود.

نقطه بازگشت یا SAVEPOINT یک نشانه در تراکنش کوئری ما می باشد که در صورت نیاز می توان به آن نقطه بازگشت ( ROLLBACK TO ) انجام داد. دقت داشته باشید این عملگر در تراکنش ها کاربرد دارد.

START TRANSACTION;
SAVEPOINT sp1;
DELETE FROM customers WHERE ID=1;
SAVEPOINT sp2;
DELETE FROM customers WHERE ID=2;
SAVEPOINT sp3;
DELETE FROM customers WHERE ID=3;
ROLLBACK TO sp1;
COMMIT;

PHP + MySQL transactions

با استفاده از کلاس PDO و یا رابط کاربری mysqli می توانیم از transaction ها در PHP , MySQL استفاده کنیم. مثال زیر $db یک PDO Handler می باشد که متد های آن طی یک مثال توضیح داده شده است.

try {
    $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();
}

با استفاده از دستورات زیر در mysqli می توانیم از تراکنش ها استفاده کنیم :

$link = mysqli_connect("127.0.0.1", "my_user", "my_password", "sakila");
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}
mysqli_begin_transaction($link, MYSQLI_TRANS_START_READ_ONLY);

mysqli_query($link, "SELECT first_name, last_name FROM actor LIMIT 1");
mysqli_commit($link);

mysqli_close($link);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}
$mysqli->query("CREATE TABLE Language LIKE CountryLanguage");
/* set autocommit to off */
$mysqli->autocommit(FALSE);
/* Insert some values */
$mysqli->query("INSERT INTO Language VALUES ('DEU', 'Bavarian', 'F', 11.2)");
$mysqli->query("INSERT INTO Language VALUES ('DEU', 'Swabian', 'F', 9.4)");
/* commit transaction */
$mysqli->commit();
/* drop table */
$mysqli->query("DROP TABLE Language");
/* close connection */
$mysqli->close();

نکته : از تراکنش ها در محیط های تست (UNIT TEST) نیز برای تست رابط های پایگاه داده در نرم افزار استفاده می شود.

اشتراک گذاری :

مدیر وب سایت گنوتک . برنامه نویسی رو با زبان C در هفده سالگی شروع کردم . در حال حاضر به برنامه نویسی php برپایه معماری MVC , HMVC و همچنین سیستم مدیریت محتوای WordPress و فریم ورک محبوب لاراول علاقه مند هستم و دوست دارم اطلاعاتم رو با شما به اشتراک بگذارم.

۰ دیدگاه برای تراکنش ها یا transaction در MySQL Engine

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *