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

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

286

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
Promotion

Are you sure to start over?

Loading...