MySQLi Transactions

মাইএসকিউএল আই (MySQLi) - Database Tutorials

276

MySQLi তে ট্রানজেকশন (Transactions) একটি গুরুত্বপূর্ণ ফিচার যা ডেটাবেস অপারেশনগুলিকে একত্রে গ্রুপ করে এবং নিশ্চিত করে যে সেগুলি সফলভাবে সম্পন্ন হয়েছে। যদি কোন কারণে একটি অপারেশন ব্যর্থ হয়, তাহলে পুরো ট্রানজেকশনটি বাতিল করা হয় এবং ডেটাবেসে কোনো পরিবর্তন প্রযোজ্য হয় না। এটি ডেটাবেসের একত্রীকরণ এবং তথ্যের সঠিকতা নিশ্চিত করতে সহায়তা করে।

এখানে আমরা দেখব কীভাবে MySQLi দিয়ে ট্রানজেকশন পরিচালনা করতে হয়।


MySQLi Transactions এর মূল ধারণা

  1. BEGIN: একটি ট্রানজেকশন শুরু করা হয়।
  2. COMMIT: ট্রানজেকশন সফল হলে পরিবর্তনগুলো ডেটাবেসে সেভ করা হয়।
  3. ROLLBACK: কোনো ত্রুটি বা সমস্যা হলে ট্রানজেকশনটি বাতিল করা হয় এবং পূর্বের অবস্থায় ফিরিয়ে আনা হয়।

MySQLi দিয়ে Transactions ব্যবহার করা

MySQLi তে ট্রানজেকশন পরিচালনার জন্য নিচের ফাংশনগুলো ব্যবহার করা হয়:

  • begin_transaction(): ট্রানজেকশন শুরু করে।
  • commit(): ট্রানজেকশন সফলভাবে শেষ হলে পরিবর্তনগুলো ডেটাবেসে সংরক্ষণ করে।
  • rollback(): কোনো ত্রুটি হলে ট্রানজেকশনটি বাতিল করে পূর্বাবস্থায় ফিরিয়ে আনে।

নিচে একটি উদাহরণ দেওয়া হলো, যেখানে একটি সিম্পল ট্রানজেকশন তৈরি করা হয়েছে:


উদাহরণ: MySQLi Transactions

Object-Oriented স্টাইল (MySQLi)

<?php
// MySQLi সংযোগ তৈরি
$host = "localhost";
$username = "root";
$password = "";
$database = "testdb";

$conn = new mysqli($host, $username, $password, $database);

// সংযোগ চেক
if ($conn->connect_errno) {
    die("MySQLi সংযোগ ত্রুটি: " . $conn->connect_error);
}

// ট্রানজেকশন শুরু
$conn->begin_transaction();

try {
    // প্রথম ইনসার্ট অপারেশন
    $conn->query("INSERT INTO users (username, email) VALUES ('user1', 'user1@example.com')");

    // দ্বিতীয় ইনসার্ট অপারেশন (এটি মক আপ অপারেশন হিসেবে দেওয়া হয়েছে)
    $conn->query("INSERT INTO users (username, email) VALUES ('user2', 'user2@example.com')");

    // যদি সব কিছু ঠিক থাকে, ট্রানজেকশন কমিট করা হবে
    $conn->commit();
    echo "ট্রানজেকশন সফল!";
} catch (Exception $e) {
    // কোনো ত্রুটি ঘটলে, ট্রানজেকশন রোলব্যাক করা হবে
    $conn->rollback();
    echo "ত্রুটি ঘটেছে: " . $e->getMessage();
}

// সংযোগ বন্ধ করা
$conn->close();
?>

Procedural স্টাইল (MySQLi)

<?php
// MySQLi সংযোগ তৈরি
$host = "localhost";
$username = "root";
$password = "";
$database = "testdb";

$conn = mysqli_connect($host, $username, $password, $database);

// সংযোগ চেক
if (mysqli_connect_errno()) {
    die("MySQLi সংযোগ ত্রুটি: " . mysqli_connect_error());
}

// ট্রানজেকশন শুরু
mysqli_begin_transaction($conn);

try {
    // প্রথম ইনসার্ট অপারেশন
    mysqli_query($conn, "INSERT INTO users (username, email) VALUES ('user1', 'user1@example.com')");

    // দ্বিতীয় ইনসার্ট অপারেশন
    mysqli_query($conn, "INSERT INTO users (username, email) VALUES ('user2', 'user2@example.com')");

    // যদি সব কিছু ঠিক থাকে, ট্রানজেকশন কমিট করা হবে
    mysqli_commit($conn);
    echo "ট্রানজেকশন সফল!";
} catch (Exception $e) {
    // কোনো ত্রুটি ঘটলে, ট্রানজেকশন রোলব্যাক করা হবে
    mysqli_roll_back($conn);
    echo "ত্রুটি ঘটেছে: " . $e->getMessage();
}

// সংযোগ বন্ধ করা
mysqli_close($conn);
?>

MySQLi Transactions ব্যবহারের সুবিধা

  1. অ্যাটমিক অপারেশন: ট্রানজেকশনের মাধ্যমে আপনি একাধিক SQL অপারেশনকে একত্রে একসাথে চালাতে পারবেন, এবং যদি কোনো একটি অপারেশন ব্যর্থ হয়, তাহলে পুরো প্রক্রিয়া বাতিল হবে, ফলে ডেটাবেসের ডেটা সঠিক থাকবে।
  2. ডেটাবেসের একত্রীকরণ (Consistency): ডেটাবেসের অবস্থা নিশ্চিত রাখা যায়, অর্থাৎ যখন একাধিক ডেটাবেস অপারেশন একসাথে করা হয়, তখন সেগুলি একত্রে সফল না হলে ডেটাবেসের কোনো পরিবর্তন হবে না।
  3. ত্রুটি হ্যান্ডলিং: ট্রানজেকশন ব্যবহারের মাধ্যমে আপনি সহজেই ত্রুটি পরিচালনা করতে পারবেন, যেমন ROLLBACK() দিয়ে আগের অবস্থায় ফিরে আসা।
  4. কর্মক্ষমতা বৃদ্ধি: একাধিক SQL কুয়েরি একসাথে পাঠানো হলে সার্ভারকে কম লোড দিতে সহায়তা করে, যার ফলে কর্মক্ষমতা বৃদ্ধি পায়।

Transaction Isolation Levels

MySQLi তে ট্রানজেকশনের সাথে সম্পর্কিত Isolation Level সেট করা সম্ভব। Isolation Level নির্ধারণ করে, একাধিক ট্রানজেকশনের মধ্যে কতটা সঙ্গতি থাকবে। MySQL এ প্রধান Isolation Levels হল:

  1. READ UNCOMMITTED: এক ট্রানজেকশন অন্য ট্রানজেকশনের মধ্যে সম্পন্ন হওয়া পরিবর্তন দেখতে পাবে।
  2. READ COMMITTED: এক ট্রানজেকশন শুধুমাত্র অন্য ট্রানজেকশন দ্বারা কমিট করা পরিবর্তন দেখতে পাবে।
  3. REPEATABLE READ: এক ট্রানজেকশন দ্বারা শুরু হওয়া কোন পরিবর্তন অন্য ট্রানজেকশন দ্বারা পরিবর্তন করা যাবে না, যতক্ষণ না প্রথম ট্রানজেকশন কমিট হয়।
  4. SERIALIZABLE: সবচেয়ে শক্তিশালী Isolation Level, যেখানে এক ট্রানজেকশন অন্যটি সম্পন্ন হওয়া পর্যন্ত অপেক্ষা করবে।

এটি SET TRANSACTION ISOLATION LEVEL কমান্ড দিয়ে সেট করা যেতে পারে:

$conn->query("SET TRANSACTION ISOLATION LEVEL SERIALIZABLE");

সারাংশ

MySQLi তে ট্রানজেকশন ব্যবহারের মাধ্যমে আপনি একাধিক ডেটাবেস অপারেশনকে একটি অ্যাটমিক ইউনিট হিসেবে পরিচালনা করতে পারেন। এটি ডেটাবেসে একতা এবং সঠিকতা নিশ্চিত করার জন্য গুরুত্বপূর্ণ, বিশেষ করে যখন একাধিক অপারেশন একসাথে চালানো হয়। BEGIN, COMMIT, এবং ROLLBACK ফাংশনগুলো ব্যবহার করে আপনি সঠিকভাবে MySQLi ট্রানজেকশন পরিচালনা করতে পারেন এবং কোনো ত্রুটি ঘটলে আগের অবস্থায় ফিরে আসতে পারেন।

Content added By

MySQLi তে Transaction (ট্রানজেকশন) হল একাধিক SQL স্টেটমেন্টের একটি সিরিজ, যা একযোগে সম্পাদিত হয়। একটি ট্রানজেকশন এর উদ্দেশ্য হল ডেটাবেসের অপারেশনগুলির মধ্যে একতা, অখণ্ডতা এবং নিরাপত্তা নিশ্চিত করা। বিশেষভাবে, ট্রানজেকশন ব্যবহৃত হয় এমন পরিস্থিতিতে, যেখানে একাধিক কোয়েরি একত্রে সঠিকভাবে সম্পাদন করতে হয়, এবং যদি কোনো একটি কোয়েরি ব্যর্থ হয়, তবে পুরো প্রক্রিয়াটি বাতিল করতে হয়।

ট্রানজেকশন ব্যবহারের প্রধান উপকারিতা হলো atomicity, consistency, isolation, এবং durability (ACID প্রিন্সিপল), যা ডেটাবেসে কার্যকর ডেটা পরিচালনার জন্য অপরিহার্য।


Transaction কী?

ট্রানজেকশন হল একটি ডেটাবেস অপারেশন ব্লক, যা একাধিক SQL স্টেটমেন্ট একত্রে প্রক্রিয়াকরণ করে। একটি ট্রানজেকশন শুরু হয় এবং শেষ হয়, এবং এর মধ্যে সব অপারেশন সফলভাবে সম্পন্ন হলে তা commit হয় (অর্থাৎ, ডেটাবেসে পরিবর্তন স্থায়ীভাবে সংরক্ষিত হয়)। যদি এর মধ্যে কোনো ত্রুটি ঘটে, তবে তা rollback করা হয় (অর্থাৎ, সমস্ত পরিবর্তন বাতিল করা হয় এবং পূর্বাবস্থায় ফিরে আসে)।

ACID (Atomicity, Consistency, Isolation, Durability) প্রিন্সিপল

ট্রানজেকশন ব্যবহারের মাধ্যমে ACID প্রিন্সিপল অনুসরণ করা হয়:

  • Atomicity (পারমাণবিকতা): ট্রানজেকশনের সমস্ত অপারেশন একত্রে সম্পন্ন হবে অথবা সম্পূর্ণভাবে বাতিল হবে। অর্থাৎ, যদি কোনো একটি অপারেশন ব্যর্থ হয়, তবে অন্যান্য অপারেশনগুলিও বাতিল হয়ে যাবে।
  • Consistency (সঙ্গতি): ট্রানজেকশন শেষে ডেটাবেসের ডেটা সঠিক এবং ধারাবাহিক থাকবে।
  • Isolation (আনবিকতা): একাধিক ট্রানজেকশন একযোগে চালানোর সময়, একটি ট্রানজেকশন অন্যটির সাথে হস্তক্ষেপ করবে না। প্রতিটি ট্রানজেকশন যেন এককভাবে কাজ করে, তা নিশ্চিত করা হয়।
  • Durability (স্থায়ীত্ব): ট্রানজেকশন শেষ হওয়ার পর, পরিবর্তনগুলি স্থায়ীভাবে ডেটাবেসে সংরক্ষিত হবে, এমনকি সিস্টেম ক্র্যাশ হলে সেগুলি পুনরুদ্ধারযোগ্য থাকবে।

কেন Transaction প্রয়োজন?

  1. ডেটার অখণ্ডতা এবং নির্ভুলতা নিশ্চিত করা: একাধিক অপারেশন সম্পাদন করার সময় যদি কোন একটি অপারেশন ব্যর্থ হয়, তবে পুরো ট্রানজেকশনটি ব্যর্থ হতে হবে এবং পূর্বাবস্থায় ফিরে আসবে। এভাবে ডেটাবেসে কোনো অপ্রত্যাশিত পরিবর্তন হতে দেয় না।

    উদাহরণ: একটি অ্যাপ্লিকেশন যেখানে একজন গ্রাহক অর্থ স্থানান্তর করে। যদি একটিই অপারেশন ব্যর্থ হয় (যেমন, একাউন্টে টাকা স্থানান্তর বা ব্যালান্স আপডেট), তবে সমস্ত অপারেশন বাতিল করা হয় এবং ডেটাবেসে কোন ভুল স্থানান্তর হবে না।

  2. ডেটাবেসের সঙ্গতি বজায় রাখা: ট্রানজেকশনের মাধ্যমে নিশ্চিত করা হয় যে ডেটাবেসের সমস্ত রেকর্ড সঠিকভাবে আপডেট এবং সিঙ্ক্রোনাইজ করা হচ্ছে।
  3. অপারেশনগুলির মধ্যে পরিপূর্ণতা (Completeness): ট্রানজেকশন ব্যবহার করলে আপনি নিশ্চিত হতে পারেন যে একাধিক কনকারেন্ট অপারেশন সঠিকভাবে চলবে এবং একে অপরকে প্রভাবিত করবে না।
  4. একাধিক স্টেটমেন্ট একত্রে প্রক্রিয়াকরণ: একটি ট্রানজেকশনের মাধ্যমে একাধিক SQL স্টেটমেন্ট একযোগে চালানো যায়, যা বড় প্রক্রিয়া বা ইম্পর্ট/এক্সপোর্ট অপারেশনগুলির জন্য খুবই প্রয়োজনীয়।

MySQLi তে Transaction ব্যবহারের পদ্ধতি

MySQLi তে ট্রানজেকশন ব্যবহারের জন্য নিচের ধাপগুলো অনুসরণ করা হয়:

  1. BEGIN TRANSACTION: ট্রানজেকশন শুরু করা।
  2. COMMIT: ট্রানজেকশন সফলভাবে সম্পন্ন হলে, সমস্ত পরিবর্তন সংরক্ষণ করা।
  3. ROLLBACK: কোনো ত্রুটি ঘটলে, সমস্ত পরিবর্তন পূর্বাবস্থায় ফিরিয়ে আনা।

কোড উদাহরণ:

<?php
// MySQLi সংযোগ তৈরি
$mysqli = new mysqli("localhost", "username", "password", "database_name");

// সংযোগ চেক করা
if ($mysqli->connect_error) {
    die("Connection failed: " . $mysqli->connect_error);
}

// ট্রানজেকশন শুরু করা
$mysqli->begin_transaction();

try {
    // প্রথম SQL কোয়েরি: টাকা স্থানান্তর
    $mysqli->query("UPDATE accounts SET balance = balance - 100 WHERE username = 'user1'");
    
    // দ্বিতীয় SQL কোয়েরি: অন্য একাউন্টে টাকা জমা করা
    $mysqli->query("UPDATE accounts SET balance = balance + 100 WHERE username = 'user2'");
    
    // ট্রানজেকশন কমিট করা
    $mysqli->commit();
    echo "Transaction completed successfully.";
} catch (Exception $e) {
    // কোনো ত্রুটি ঘটলে রোলব্যাক করা
    $mysqli->rollback();
    echo "Transaction failed: " . $e->getMessage();
}

// সংযোগ বন্ধ করা
$mysqli->close();
?>

এখানে, প্রথমে ট্রানজেকশন শুরু করা হয়েছে begin_transaction() দিয়ে। তারপর দুটি SQL কোয়েরি একযোগে সম্পাদিত হচ্ছে, এবং যদি কোনো কোয়েরি ব্যর্থ হয়, তবে rollback() ফাংশনের মাধ্যমে সমস্ত পরিবর্তন পূর্বাবস্থায় ফিরিয়ে আনা হবে। যদি সবকিছু সঠিকভাবে সম্পন্ন হয়, তবে commit() ফাংশনটি পরিবর্তনগুলি স্থায়ী করবে।


সারাংশ

MySQLi তে ট্রানজেকশন ব্যবহারের মাধ্যমে একাধিক SQL স্টেটমেন্ট একযোগে নিরাপদভাবে সম্পাদন করা সম্ভব। ট্রানজেকশন ব্যবহারের মাধ্যমে ডেটাবেসে কোনো ভুল বা অপ্রত্যাশিত পরিবর্তন এড়ানো যায় এবং ডেটার অখণ্ডতা বজায় রাখা হয়। ACID প্রিন্সিপল অনুসরণ করে, এটি ডেটাবেসের নিরাপত্তা ও সঠিকতা নিশ্চিত করে, বিশেষ করে যখন একাধিক ডেটাবেস অপারেশন একত্রে সম্পাদিত হয়। MySQLi তে ট্রানজেকশন শুরু করা, সম্পন্ন করা এবং রোলব্যাক করা সহজ, যা ডেটাবেস ম্যানিপুলেশনের জন্য অত্যন্ত কার্যকরী।

Content added By

MySQLi তে Transaction ব্যবস্থাপনা অত্যন্ত গুরুত্বপূর্ণ একটি ফিচার, যা ডেটাবেজ অপারেশনগুলিকে একযোগে একত্রিত (Atomic) রাখতে সাহায্য করে। একটি ট্রানজেকশনের মধ্যে একাধিক SQL অপারেশন একত্রে সম্পন্ন করা হয় এবং যদি কোনো একটি অপারেশন ব্যর্থ হয়, তাহলে পুরো ট্রানজেকশনটি বাতিল (Rollback) করা হয়। এটি ডেটাবেজের অখণ্ডতা (Integrity) বজায় রাখতে সহায়তা করে।

MySQLi তে Transaction ব্যবস্থাপনার জন্য START TRANSACTION, COMMIT, এবং ROLLBACK ব্যবহার করা হয়। নিচে আমরা এ তিনটি কাজের প্রক্রিয়া ব্যাখ্যা করব।


১. Transaction শুরু (START TRANSACTION)

যখন আপনি একটি নতুন ট্রানজেকশন শুরু করেন, তখন ডেটাবেজে সমস্ত পরিবর্তন একত্রিত করে করা হয়। ট্রানজেকশন শুরু করার জন্য START TRANSACTION ব্যবহার করা হয়। এর মাধ্যমে পরবর্তী সব অপারেশনকে একটি একক ইউনিট হিসেবে দেখা হয়।

উদাহরণ

<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "your_database";

// MySQLi সংযোগ স্থাপন
$conn = new mysqli($servername, $username, $password, $dbname);

// সংযোগ চেক করা
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

// ট্রানজেকশন শুরু করা
$conn->begin_transaction();
?>

এখানে:

  • begin_transaction(): এটি ট্রানজেকশন শুরু করার জন্য ব্যবহৃত হয়। MySQLi এ এই মেথডটি ট্রানজেকশন শুরু করে।

২. Commit (ট্রানজেকশন সম্পন্ন করা)

যখন ট্রানজেকশনের সমস্ত SQL অপারেশন সফলভাবে সম্পন্ন হয়, তখন COMMIT ব্যবহার করে পরিবর্তনগুলি স্থায়ী (commit) করা হয়। COMMIT হল ডেটাবেজের পরিবর্তনগুলি চূড়ান্ত করার নির্দেশনা।

উদাহরণ

<?php
// SQL অপারেশনগুলো সম্পন্ন করার পরে
$sql1 = "UPDATE users SET balance = balance - 100 WHERE id = 1";
$sql2 = "UPDATE users SET balance = balance + 100 WHERE id = 2";

// প্রথম SQL অপারেশন চালানো
if ($conn->query($sql1) === TRUE) {
    // দ্বিতীয় SQL অপারেশন চালানো
    if ($conn->query($sql2) === TRUE) {
        // সবকিছু সফল হলে ট্রানজেকশন কমিট করা
        $conn->commit();
        echo "Transaction committed successfully.";
    } else {
        // দ্বিতীয় অপারেশন ব্যর্থ হলে রোলব্যাক করা
        $conn->rollback();
        echo "Transaction rolled back: " . $conn->error;
    }
} else {
    // প্রথম অপারেশন ব্যর্থ হলে রোলব্যাক করা
    $conn->rollback();
    echo "Transaction rolled back: " . $conn->error;
}

// সংযোগ বন্ধ করা
$conn->close();
?>

এখানে:

  • commit(): এটি সমস্ত অপারেশন সফল হলে ট্রানজেকশন কমিট করার জন্য ব্যবহৃত হয়।
  • যদি কোনো একটি অপারেশন ব্যর্থ হয়, তাহলে rollback() ব্যবহার করা হয়।

৩. Rollback (ট্রানজেকশন বাতিল করা)

যদি ট্রানজেকশনের মধ্যে কোনো একটি SQL অপারেশন ব্যর্থ হয়, তাহলে পুরো ট্রানজেকশনটি বাতিল করতে ROLLBACK ব্যবহার করা হয়। এটি সব পরিবর্তনগুলি পূর্বাবস্থায় ফিরিয়ে নিয়ে আসে।

উদাহরণ

<?php
// SQL অপারেশনগুলো সম্পন্ন করার পরে
$sql1 = "UPDATE users SET balance = balance - 100 WHERE id = 1";
$sql2 = "UPDATE users SET balance = balance + 100 WHERE id = 2";

// প্রথম SQL অপারেশন চালানো
if ($conn->query($sql1) === TRUE) {
    // দ্বিতীয় SQL অপারেশন চালানো
    if ($conn->query($sql2) === TRUE) {
        // সবকিছু সফল হলে ট্রানজেকশন কমিট করা
        $conn->commit();
        echo "Transaction committed successfully.";
    } else {
        // দ্বিতীয় অপারেশন ব্যর্থ হলে রোলব্যাক করা
        $conn->rollback();
        echo "Transaction rolled back: " . $conn->error;
    }
} else {
    // প্রথম অপারেশন ব্যর্থ হলে রোলব্যাক করা
    $conn->rollback();
    echo "Transaction rolled back: " . $conn->error;
}

// সংযোগ বন্ধ করা
$conn->close();
?>

এখানে:

  • rollback(): এটি ট্রানজেকশনের সমস্ত পরিবর্তন বাতিল করে এবং ডেটাবেজকে পূর্বাবস্থায় ফিরিয়ে নিয়ে আসে।

৪. একাধিক SQL অপারেশন একসাথে

আপনি একাধিক SQL অপারেশন একত্রে একটি ট্রানজেকশনে প্রয়োগ করতে পারেন। যদি কোনো অপারেশন ব্যর্থ হয়, তাহলে পুরো ট্রানজেকশনটি ROLLBACK করা হবে। নীচে একটি উদাহরণ দেওয়া হল যেখানে দুটি UPDATE অপারেশন একত্রে একটি ট্রানজেকশনে করা হয়েছে।

একাধিক SQL অপারেশন উদাহরণ

<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "your_database";

// MySQLi সংযোগ স্থাপন
$conn = new mysqli($servername, $username, $password, $dbname);

// সংযোগ চেক করা
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

// ট্রানজেকশন শুরু করা
$conn->begin_transaction();

// SQL অপারেশনগুলো
$sql1 = "UPDATE accounts SET balance = balance - 200 WHERE id = 1";
$sql2 = "UPDATE accounts SET balance = balance + 200 WHERE id = 2";

// প্রথম SQL অপারেশন চালানো
if ($conn->query($sql1) === TRUE) {
    // দ্বিতীয় SQL অপারেশন চালানো
    if ($conn->query($sql2) === TRUE) {
        // সবকিছু সফল হলে ট্রানজেকশন কমিট করা
        $conn->commit();
        echo "Transaction committed successfully.";
    } else {
        // দ্বিতীয় অপারেশন ব্যর্থ হলে রোলব্যাক করা
        $conn->rollback();
        echo "Transaction rolled back: " . $conn->error;
    }
} else {
    // প্রথম অপারেশন ব্যর্থ হলে রোলব্যাক করা
    $conn->rollback();
    echo "Transaction rolled back: " . $conn->error;
}

// সংযোগ বন্ধ করা
$conn->close();
?>

এখানে:

  • দুটি SQL অপারেশন একত্রে একটি ট্রানজেকশনে রাখা হয়েছে।
  • যদি কোনো একটি অপারেশন ব্যর্থ হয়, তাহলে পুরো ট্রানজেকশনটি রোলব্যাক হবে এবং কোন পরিবর্তন ডেটাবেজে সংরক্ষিত হবে না।

সারাংশ

MySQLi তে Transaction ব্যবস্থাপনা খুবই গুরুত্বপূর্ণ, যা ডেটাবেজের অখণ্ডতা নিশ্চিত করতে সাহায্য করে। START TRANSACTION দিয়ে একটি ট্রানজেকশন শুরু হয়, COMMIT দিয়ে সমস্ত অপারেশন সফল হলে পরিবর্তনগুলি স্থায়ী করা হয়, এবং ROLLBACK দিয়ে কোনো ত্রুটির কারণে সমস্ত অপারেশন বাতিল করা হয়। ট্রানজেকশন ব্যবহারের মাধ্যমে ডেটাবেজের নিরাপত্তা ও ডেটা এক্সট্র্যাকশন আরও কার্যকরী ও নির্ভরযোগ্য হয়ে ওঠে।

Content added By

MySQLi তে ট্রানজেকশন (Transaction) ব্যবহারের মাধ্যমে ডেটার ইন্টিগ্রিটি (Data Integrity) রক্ষা করা সম্ভব। ট্রানজেকশন একটি সিরিজের SQL অপারেশন যা একসাথে এক্সিকিউট করা হয়, এবং এর মাধ্যমে নিশ্চিত করা হয় যে, সমস্ত অপারেশন সফল হলে একসাথে কমিট হবে, এবং কোনো ত্রুটি ঘটলে সবকিছু রোলব্যাক হয়ে যাবে। এর ফলে ডেটাবেসে অপ্রত্যাশিত বা অসম্পূর্ণ ডেটা জমা পড়ার সম্ভাবনা কমে যায়, এবং ডেটার সঠিকতা ও নিরাপত্তা বজায় থাকে।

ট্রানজেকশন এর মূল পদক্ষেপ:

  1. START TRANSACTION: ট্রানজেকশন শুরু করা।
  2. COMMIT: সমস্ত SQL অপারেশন সফল হলে ট্রানজেকশন কমিট করা।
  3. ROLLBACK: কোনো ত্রুটি ঘটলে ট্রানজেকশন রোলব্যাক করা।

MySQLi তে Transaction ব্যবহারের উদাহরণ

MySQLi তে ট্রানজেকশন ব্যবহারের জন্য আমরা দুটি পদ্ধতি ব্যবহার করতে পারি:

  1. Procedural স্টাইল
  2. Object-Oriented স্টাইল

এখানে, আমরা একটি সাধারণ উদাহরণ দেখব যেখানে দুটি টেবিলের মধ্যে ডেটা ইন্সার্ট করার সময় ট্রানজেকশন ব্যবহৃত হবে। ধরুন, আমাদের দুটি টেবিল রয়েছে:

  • users (id, name, email)
  • orders (order_id, user_id, total_price)

আমরা দুটি টেবিলেই ডেটা ইন্সার্ট করব এবং যদি কোনো এক টেবিলের ইনসার্ট অপারেশন ব্যর্থ হয়, তবে পুরো ট্রানজেকশন রোলব্যাক হবে।


১. Procedural স্টাইলে Transaction ব্যবহার

<?php
// ডেটাবেস সংযোগ
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "your_database_name";

$conn = mysqli_connect($servername, $username, $password, $dbname);

// সংযোগ পরীক্ষা করা
if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}

// ট্রানজেকশন শুরু
mysqli_begin_transaction($conn);

try {
    // প্রথম টেবিল (users) এ ডেটা ইন্সার্ট
    $sql1 = "INSERT INTO users (name, email) VALUES ('John Doe', 'john@example.com')";
    if (!mysqli_query($conn, $sql1)) {
        throw new Exception("Error in inserting into users table");
    }

    // দ্বিতীয় টেবিল (orders) এ ডেটা ইন্সার্ট
    $sql2 = "INSERT INTO orders (user_id, total_price) VALUES (LAST_INSERT_ID(), 250)";
    if (!mysqli_query($conn, $sql2)) {
        throw new Exception("Error in inserting into orders table");
    }

    // যদি সবকিছু ঠিক থাকে, ট্রানজেকশন কমিট করা
    mysqli_commit($conn);
    echo "Transaction successful!";
} catch (Exception $e) {
    // কোনো ত্রুটি ঘটলে রোলব্যাক করা
    mysqli_roll_back($conn);
    echo "Transaction failed: " . $e->getMessage();
}

// সংযোগ বন্ধ করা
mysqli_close($conn);
?>

ব্যাখ্যা:

  • mysqli_begin_transaction(): ট্রানজেকশন শুরু করা হয়।
  • mysqli_query(): SQL কুয়েরি এক্সিকিউট করা হয়।
  • mysqli_commit(): সমস্ত কুয়েরি সফলভাবে এক্সিকিউট হলে ট্রানজেকশন কমিট করা হয়।
  • mysqli_rollback(): কোনো ত্রুটি ঘটলে ট্রানজেকশন রোলব্যাক করা হয়।
  • try-catch ব্লক: যে কোনো ত্রুটি ঘটলে তা ক্যাচ করা এবং ট্রানজেকশন রোলব্যাক করা।

এখানে দুটি টেবিলের মধ্যে ডেটা ইনসার্ট করার সময় ট্রানজেকশন ব্যবহৃত হয়েছে, এবং কোনো ত্রুটি ঘটলে পুরো প্রক্রিয়া রোলব্যাক হয়ে যাবে।


২. Object-Oriented স্টাইলে Transaction ব্যবহার

<?php
// ডেটাবেস সংযোগ
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "your_database_name";

$conn = new mysqli($servername, $username, $password, $dbname);

// সংযোগ পরীক্ষা করা
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

// ট্রানজেকশন শুরু
$conn->begin_transaction();

try {
    // প্রথম টেবিল (users) এ ডেটা ইন্সার্ট
    $sql1 = "INSERT INTO users (name, email) VALUES ('John Doe', 'john@example.com')";
    if (!$conn->query($sql1)) {
        throw new Exception("Error in inserting into users table");
    }

    // দ্বিতীয় টেবিল (orders) এ ডেটা ইন্সার্ট
    $sql2 = "INSERT INTO orders (user_id, total_price) VALUES (LAST_INSERT_ID(), 250)";
    if (!$conn->query($sql2)) {
        throw new Exception("Error in inserting into orders table");
    }

    // যদি সবকিছু ঠিক থাকে, ট্রানজেকশন কমিট করা
    $conn->commit();
    echo "Transaction successful!";
} catch (Exception $e) {
    // কোনো ত্রুটি ঘটলে রোলব্যাক করা
    $conn->rollback();
    echo "Transaction failed: " . $e->getMessage();
}

// সংযোগ বন্ধ করা
$conn->close();
?>

ব্যাখ্যা:

  • $conn->begin_transaction(): ট্রানজেকশন শুরু করা হয়।
  • $conn->query(): SQL কুয়েরি এক্সিকিউট করা হয়।
  • $conn->commit(): সমস্ত কুয়েরি সফল হলে ট্রানজেকশন কমিট করা হয়।
  • $conn->rollback(): কোনো ত্রুটি ঘটলে ট্রানজেকশন রোলব্যাক করা হয়।
  • try-catch ব্লক: যে কোনো ত্রুটি ঘটলে তা ক্যাচ করা এবং ট্রানজেকশন রোলব্যাক করা।

এখানে, users টেবিল এবং orders টেবিলের মধ্যে ডেটা ইনসার্ট করার জন্য ট্রানজেকশন ব্যবহৃত হয়েছে, যাতে একটি টেবিলের ইনসার্ট ব্যর্থ হলে অন্য টেবিলের ইনসার্টও বাতিল হয়ে যায়।


Transaction এর মাধ্যমে ডেটার ইন্টিগ্রিটি রক্ষা

ট্রানজেকশন ব্যবহারের মাধ্যমে আমরা Atomicity (একযোগিতার) নিশ্চিত করতে পারি। যদি কোনো একটি অপারেশন ব্যর্থ হয়, তবে পুরো প্রক্রিয়া বাতিল হয়ে যায় এবং ডেটাবেস আগের অবস্থায় ফিরে যায়। এই পদ্ধতিটি ডেটাবেসের ইন্টিগ্রিটি এবং নির্ভরযোগ্যতা বজায় রাখতে সাহায্য করে, বিশেষত যখন একাধিক টেবিল বা কমপ্লেক্স ডেটাবেস অপারেশন একসাথে এক্সিকিউট করা হয়।


সারাংশ

MySQLi তে ট্রানজেকশন ব্যবহার করে ডেটাবেসের ইন্টিগ্রিটি রক্ষা করা সম্ভব। ট্রানজেকশন নিশ্চিত করে যে একাধিক SQL অপারেশন একযোগভাবে সফল হতে হবে। যদি কোনো ত্রুটি ঘটে, তবে সমস্ত অপারেশন রোলব্যাক হয়ে যাবে এবং ডেটাবেসে কোনো অপ্রত্যাশিত পরিবর্তন হবে না। MySQLi তে ট্রানজেকশন ব্যবহারের জন্য Procedural বা Object-Oriented স্টাইল দুটি ব্যবহার করা যায়।

Content added By

MySQLi তে অটোমেটিক কমিট (Auto-commit) ডিফল্টভাবে চালু থাকে, অর্থাৎ প্রতিটি SQL ক্যোয়ারি সম্পাদিত হওয়ার সাথে সাথে তা ডেটাবেসে স্বয়ংক্রিয়ভাবে সংরক্ষিত হয়ে যায়। তবে, যদি আপনি ট্রানজেকশন পরিচালনা করতে চান, যেখানে একাধিক SQL ক্যোয়ারি একসাথে কার্যকরী হয় এবং সবগুলো সফল হলে একসাথে কমিট (commit) করা হয়, তাহলে আপনাকে অটোমেটিক কমিট বন্ধ (turn off) করতে হবে।

অটোমেটিক কমিট বন্ধ করে, আপনি ট্রানজেকশন পরিচালনা করতে পারবেন, যা ডেটাবেসে একাধিক ক্যোয়ারি একসাথে প্রক্রিয়া করে, এবং যদি কোন সমস্যা হয়, তাহলে পুরো ট্রানজেকশনটি রোলব্যাক (rollback) করা যাবে।


MySQLi তে অটোমেটিক কমিট বন্ধ করার পদ্ধতি

MySQLi তে অটোমেটিক কমিট বন্ধ করার জন্য autocommit() মেথড ব্যবহার করা হয়। যখন আপনি autocommit(false) সেট করবেন, তখন ডেটাবেসের মধ্যে কোনো ক্যোয়ারি ট্রানজেকশন হিসেবে কাজ করবে, এবং আপনি নিজে commit() বা rollback() মেথডের মাধ্যমে সিদ্ধান্ত নিতে পারবেন।


অটোমেটিক কমিট বন্ধ করা (Auto-commit off)

<?php
// ডেটাবেসে সংযোগ স্থাপন করা
$mysqli = new mysqli("localhost", "username", "password", "database_name");

// সংযোগ সফল না হলে ত্রুটি দেখানো
if ($mysqli->connect_error) {
    die("Connection failed: " . $mysqli->connect_error);
}

// অটোমেটিক কমিট বন্ধ করা
$mysqli->autocommit(FALSE);

// প্রথম ক্যোয়ারি চালানো (যেমন: ইনসার্ট)
$sql1 = "INSERT INTO users (name, email) VALUES ('John Doe', 'john.doe@example.com')";
if (!$mysqli->query($sql1)) {
    // প্রথম ক্যোয়ারি ব্যর্থ হলে রোলব্যাক
    $mysqli->rollback();
    echo "Error: " . $mysqli->error;
    exit;
}

// দ্বিতীয় ক্যোয়ারি চালানো (যেমন: আপডেট)
$sql2 = "UPDATE users SET email='john.newemail@example.com' WHERE name='John Doe'";
if (!$mysqli->query($sql2)) {
    // দ্বিতীয় ক্যোয়ারি ব্যর্থ হলে রোলব্যাক
    $mysqli->rollback();
    echo "Error: " . $mysqli->error;
    exit;
}

// সবকিছু সঠিক হলে কমিট
$mysqli->commit();
echo "Transaction successful.";

// সংযোগ বন্ধ করা
$mysqli->close();
?>

এখানে:

  1. $mysqli->autocommit(FALSE) ব্যবহার করে অটোমেটিক কমিট বন্ধ করা হয়েছে।
  2. দুটি SQL ক্যোয়ারি একে একে চালানো হয়েছে: প্রথমে ইনসার্ট, তারপর আপডেট।
  3. যদি কোন একটি ক্যোয়ারি ব্যর্থ হয়, তবে rollback() মেথড ব্যবহার করে পুরো ট্রানজেকশনটি বাতিল (rollback) করা হবে।
  4. সমস্ত ক্যোয়ারি সফল হলে commit() মেথড ব্যবহার করে ট্রানজেকশনটি কমিট (commit) করা হবে, অর্থাৎ ডেটাবেসে স্থায়ীভাবে পরিবর্তন সংরক্ষণ করা হবে।

অটোমেটিক কমিট পুনরায় চালু করা (Auto-commit on)

ট্রানজেকশন ব্যবহারের পর, অটোমেটিক কমিট আবার চালু করতে হলে autocommit(true) মেথড ব্যবহার করতে হবে:

<?php
// অটোমেটিক কমিট পুনরায় চালু করা
$mysqli->autocommit(TRUE);
?>

এটি নিশ্চিত করবে যে পরবর্তী SQL ক্যোয়ারি গুলো আবার স্বয়ংক্রিয়ভাবে কমিট হয়ে যাবে।


সারাংশ

MySQLi তে অটোমেটিক কমিট (Auto-commit) ডিফল্টভাবে চালু থাকে, কিন্তু ট্রানজেকশন পরিচালনা করতে চাইলে আপনি এটি বন্ধ (off) করতে পারেন। এর মাধ্যমে একাধিক SQL ক্যোয়ারি একসাথে কার্যকরী হবে এবং যদি কোন ক্যোয়ারি ব্যর্থ হয়, তাহলে পুরো ট্রানজেকশন রোলব্যাক করা যাবে। autocommit(FALSE) ব্যবহার করে অটোমেটিক কমিট বন্ধ করা হয় এবং commit()rollback() মেথডের মাধ্যমে ট্রানজেকশন পরিচালনা করা হয়।

Content added By
Promotion

Are you sure to start over?

Loading...