تراکنش ها – Transaction

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

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

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

  1. START TRANSACTION or BEGIN به معنی شروع یک تراکنش است.
  2. COMMIT تایید تراکنش جاری ، اجرای دائمی کوئری ها.
  3. 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 استفاده کنیم.

نقطه بازگشت یا 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;

برای مدیریت تراکنش MySQL در PHP ، از مراحل زیر استفاده می کنیم:

1.با فراخوانی متد ()beginTransaction  متد PDO معامله را شروع کنید.

2.دستورات SQL و فراخوانی متد () را در یک بلوک try قرار دهید.

3.با فراخوانی روش rollBack () شیء PDO ، تراکنش را در بلوک catch بازگردانید.

مثال تراکنش PHP MySQL

ما جدولی با نام حساب ایجاد می کنیم تا انتقال پول بین دو حساب بانکی را نشان دهد.

ابتدا عبارت زیر را برای ایجاد جدول حساب ها اجرا کنید:

CREATE TABLE accounts (
    id     INT AUTO_INCREMENT PRIMARY KEY,
    name   VARCHAR (50)    NOT NULL,
    amount DECIMAL (19, 4) NOT NULL
);

دوم ، دو ردیف را در جدول حساب ها وارد کنید:

INSERT INTO accounts(name,amount)
VALUES('John',25000),
      ('Mary',95000);

سوم ، پرس و جو از جدول حساب ها:

SELECT *
  FROM accounts;

PHP MySQL Transaction example

 

 

با استفاده از کلاس 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 می توانیم از تراکنش ها استفاده کنیم :

  • ()mysqli_begin_transaction : شروع تراکنش یا START TRANSACTION
  • ()mysqli_autocommit : متغیر autocommit را برابر با 0 قرار می دهد و به عبارتی شروع تراکنش
  • ()mysqli_commit : تایید تراکنش
  • ()mysqli_rollback : لغو تراکنش
  • ()mysqli_savepoint : ذخیره یک نقطه بازگشت.
$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);

 

بدون دیدگاه

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

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