SQL ট্রানজেকশন (Transaction) ডাটাবেজ অপারেশনের একটি মৌলিক ধারণা, যা একাধিক SQL স্টেটমেন্টকে একটি লজিক্যাল ইউনিটে পরিণত করে। আপনি যদি একটি ব্যাংকিং অ্যাপ্লিকেশন তৈরি করেন যেখানে এক অ্যাকাউন্ট থেকে টাকা কেটে অন্য অ্যাকাউন্টে জমা দিতে হয়, তাহলে একটি স্টেটমেন্ট ফেইল করলেও পুরো প্রক্রিয়াটি যেন অর্ধেক না থেকে যায়—এটাই নিশ্চিত করে ট্রানজেকশন। এই টিউটোরিয়ালে আমরা শিখবো SQL ট্রানজেকশন কী, কেন এটি প্রয়োজন, এবং কীভাবে এটি সঠিকভাবে ব্যবহার করতে হয়।

ট্রানজেকশন কী এবং কেন এটি গুরুত্বপূর্ণ?

একটি SQL ট্রানজেকশন হলো এক বা একাধিক ডাটাবেজ অপারেশনের (যেমন INSERT, UPDATE, DELETE) একটি গ্রুপ, যা সম্পূর্ণরূপে সফল বা সম্পূর্ণরূপে ব্যর্থ হতে বাধ্য। এটি ডাটাবেজের ACID (Atomicity, Consistency, Isolation, Durability) বৈশিষ্ট্য নিশ্চিত করে। উদাহরণস্বরূপ, একটি ই-কমার্স অর্ডার প্রক্রিয়ায় পণ্যের স্টক কমানো এবং অর্ডার তৈরি করা—দুটি অপারেশনই একসাথে সম্পন্ন হতে হবে।

ট্রানজেকশন ছাড়া, ডাটাবেজে আংশিক আপডেট ঘটতে পারে, যা ডাটা ইন্টিগ্রিটি নষ্ট করে। যেমন, ব্যাংক ট্রান্সফারের সময় একটি অ্যাকাউন্ট থেকে টাকা কেটে গেলেও অন্য অ্যাকাউন্টে জমা না হলে, টাকা হারিয়ে যাবে। ট্রানজেকশন এই সমস্যা সমাধান করে।

ট্রানজেকশনের মৌলিক কমান্ড: BEGIN, COMMIT, ROLLBACK

SQL ট্রানজেকশন নিয়ন্ত্রণের জন্য তিনটি মূল কমান্ড ব্যবহার করা হয়:

  • BEGIN TRANSACTION (বা START TRANSACTION): ট্রানজেকশন শুরু করে।
  • COMMIT: ট্রানজেকশনের সব পরিবর্তন স্থায়ী করে।
  • ROLLBACK: ট্রানজেকশনের সব পরিবর্তন বাতিল করে আগের অবস্থায় ফিরিয়ে আনে।

নিচে একটি সাধারণ উদাহরণ দেওয়া হলো যেখানে একটি ব্যাংক অ্যাকাউন্ট থেকে অন্য অ্যাকাউন্টে টাকা ট্রান্সফার করা হচ্ছে:

BEGIN TRANSACTION;

UPDATE accounts SET balance = balance - 500 WHERE account_id = 101;
UPDATE accounts SET balance = balance + 500 WHERE account_id = 102;

-- যদি কোনো সমস্যা না থাকে, তাহলে কমিট করুন
COMMIT;
-- অথবা যদি কোনো সমস্যা হয়, তাহলে রোলব্যাক করুন
-- ROLLBACK;

এখানে, প্রথম UPDATE সফল হলেও দ্বিতীয়টি ব্যর্থ হলে, ROLLBACK পুরো অপারেশন বাতিল করে দেবে, ফলে ডাটাবেজ অক্ষত থাকবে।

SAVEPOINT ব্যবহার করে আংশিক রোলব্যাক

কখনও কখনও আপনি পুরো ট্রানজেকশন নয়, বরং একটি নির্দিষ্ট পয়েন্ট পর্যন্ত ফিরে যেতে চান। সেক্ষেত্রে SAVEPOINT ব্যবহার করা হয়। এটি ট্রানজেকশনের ভেতরে একটি চিহ্নিত স্থান তৈরি করে, যেখান থেকে পরবর্তী অপারেশনগুলো বাতিল করা যায়।

BEGIN TRANSACTION;

INSERT INTO orders (customer_id, total) VALUES (1, 100);
SAVEPOINT order_created;

UPDATE inventory SET stock = stock - 1 WHERE product_id = 5;
-- যদি ইনভেন্টরি আপডেট ব্যর্থ হয়, তাহলে শুধু সেভপয়েন্ট পর্যন্ত রোলব্যাক করুন
ROLLBACK TO SAVEPOINT order_created;

-- এখন আপনি অর্ডারটি রাখতে পারেন বা অন্য কিছু করতে পারেন
COMMIT;

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

ট্রানজেকশন আইসোলেশন লেভেল (Isolation Levels)

একাধিক ট্রানজেকশন একসাথে চললে ডাটা কনসিস্টেন্সি বজায় রাখতে আইসোলেশন লেভেল নির্ধারণ করা জরুরি। সাধারণ চারটি লেভেল হলো:

  • READ UNCOMMITTED: অন্য ট্রানজেকশনের অকমিটেড ডাটা পড়তে পারে (ডার্টি রিড সম্ভব)।
  • READ COMMITTED: শুধুমাত্র কমিটেড ডাটা পড়ে (ডিফল্ট অনেক ডাটাবেজে)।
  • REPEATABLE READ: একই ট্রানজেকশনে একই ডাটা বারবার পড়লে একই ফলাফল পাওয়া যায়।
  • SERIALIZABLE: সবচেয়ে কঠোর লেভেল, ট্রানজেকশনগুলো একের পর এক চলে।

নিচে একটি উদাহরণ দেওয়া হলো যেখানে ট্রানজেকশন আইসোলেশন লেভেল সেট করা হচ্ছে:

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
BEGIN TRANSACTION;

SELECT balance FROM accounts WHERE account_id = 101;
-- অন্য ট্রানজেকশন এই সময়ে আপডেট করলেও, শুধু কমিটেড ডাটা দেখাবে

COMMIT;

সঠিক আইসোলেশন লেভেল নির্বাচন করা পারফরম্যান্স এবং ডাটা ইন্টিগ্রিটির মধ্যে ভারসাম্য রক্ষা করে।

সেরা অভ্যাস (Best Practices)

ট্রানজেকশন ব্যবহার করার সময় নিচের বিষয়গুলো মাথায় রাখুন:

  • ট্রানজেকশন যতটা সম্ভব ছোট রাখুন: দীর্ঘ ট্রানজেকশন ডাটাবেজ লক তৈরি করে, যা পারফরম্যান্স কমিয়ে দেয়।
  • ত্রুটি হ্যান্ডলিং নিশ্চিত করুন: প্রতিটি ট্রানজেকশনের শেষে COMMIT বা ROLLBACK করা বাধ্যতামূলক। অন্যথায়, ডাটাবেজ সংযোগ বন্ধ হলে অটো-রোলব্যাক হতে পারে।
  • ইমপ্লিসিট ট্রানজেকশন এড়িয়ে চলুন: অনেক ডাটাবেজে প্রতিটি SQL স্টেটমেন্ট আলাদা ট্রানজেকশনে চলে। একাধিক অপারেশনের জন্য স্পষ্টভাবে BEGIN এবং COMMIT ব্যবহার করুন।
  • আইসোলেশন লেভেল বুঝে ব্যবহার করুন: প্রয়োজনের তুলনায় বেশি কঠোর লেভেল নির্বাচন করলে পারফরম্যান্স খারাপ হতে পারে।

সারসংক্ষেপ

SQL ট্রানজেকশন ডাটাবেজ অপারেশনকে নির্ভরযোগ্য এবং কনসিস্টেন্ট রাখার মূল চাবিকাঠি। BEGIN, COMMIT, ROLLBACK, এবং SAVEPOINT ব্যবহার করে আপনি জটিল লজিক্যাল ইউনিট নিরাপদে পরিচালনা করতে পারেন। আইসোলেশন লেভেল বুঝে ব্যবহার করলে একাধিক ব্যবহারকারীর পরিবেশেও ডাটা ইন্টিগ্রিটি বজায় থাকে। পরবর্তী প্রকল্পে ট্রানজেকশন ব্যবহার করে দেখুন—আপনার ডাটাবেজ আরও শক্তিশালী হবে।

Share